java基础--02(初始化)

版权声明:Mr.Wang 汪先生 https://blog.csdn.net/weixin_37650458/article/details/85239600

1.构造函数:

    用于给对象进行初始化,是给与之对应的对象进行初始化,它具有针对性,函数中的一种。该函数的名称和所在类的名称相同。不需要定义返回值类型。所有的对象创建的时候都需要初始化才能使用。构造器能保证正确的初始化和清理,(没有正确的构造器调用,编译器就不允许创建对象),所以有了完全的控制也很安全。构造器可以有多个,并且创建对象一定会调用构造器,具体看调有参的还是无参数的而已。

2.成员变量和局部变量的区别: 

   首先他们的作用域不同,其次他们存放的位置不同,java里基本数据类型存在栈上,boolean,short,int,char,float,double,long,byte这8种,其余所有都是引用类型,都存在堆上,局部变量存在于栈内存中,成员变量存在堆内存中。

3.构造代码块和构造函数有什么区别?

 构造代码块:是给所有的对象进行初始化,也就是说,所有的对象都会调用一个代码块。只要对象一建立。就会调用这个代码块。

 构造函数:是给与之对应的对象进行初始化。它具有针对性。

4.区分重载的方法:每个重载的方法都必须有一个独一无二的参数列表。

 方法重载时,如果用基本类型做参数,传入参数的类型小于方法中形参的基本类型,实际参数的类型会自动提升,如果大于就必须强制转换,不然就要报错。Char会被转化为int类型,为什么不能以返回值来区分方法的重载,因为有时候你根本不需要返回值,你只想要被调用的效果而已,比如构造函数根本就没有返回值。

5.面向对象的特征

    封装:是指隐藏对象的属性和实现细节,仅对外提供公共访问方式。如私有的成员变量就是封装的体现。将变化隔离;便于使用;提高重用性;安全性。

    继承:java中对于继承,java只支持单继承。为什么不支持多继承呢?因为当一个类同时继承两个父类时,两个父类中有相同的功能,那么子类对象调用该功能时,运行哪一个呢?因为父类中的方法中存在方法体。但是java支持多重继承。A继承B  B继承C  C继承D。多重继承的出现,就有了继承体系。体系中的顶层父类是通过不断向上抽取而来的。它里面定义的该体系最基本最共性内容的功能。

    当子父类中出现一样的属性时,子类类型的对象,调用该属性,值是子类的属性值。 Super代表是子类所属的父类中的内存空间引用。当子父类中出现了一模一样的方法时,建立子类对象会运行子类中的方法。好像父类中的方法被覆盖掉一样。

发现子类构造函数运行时,先运行了父类的构造函数。为什么呢?原因:子类的所有构造函数中的第一行,其实都有一条隐身的语句super();

为什么子类对象初始化时,都需要调用父类中的函数?(为什么要在子类构造函数的第一行加入这个super()?)因为子类继承父类,会继承到父类中的数据,必须要看父类是如何对自己的数据进行初始化的。所以子类在进行对象初始化时,先调用父类的构造函数,这就是子类的实例化过程。

      子类中所有的构造函数都会默认访问父类中的空参数的构造函数,因为每一个子类构造内第一行都有默认的语句super(); 

  如果父类中没有空参数的构造函数,那么子类的构造函数内,必须通过super语句指定要访问的父类中的构造函数。

  如果子类构造函数中用this来指定调用子类自己的构造函数,那么被调用的构造函数也一样会访问父类中的构造函数。

super()和this()是否可以同时出现的构造函数中?两个语句只能有一个定义在第一行,所以只能出现其中一个。

 1:子类覆盖父类时,必须要保证,子类方法的权限必须大于等于父类方法权限可以实现继承。否则,编译失败。

 2:覆盖时,要么都静态,要么都不静态。 (静态只能覆盖静态,或者被静态覆盖)

  继承的一个弊端:打破了封装性。对于一些类,或者类中功能,是需要被继承,或者复写的。

  这时如何解决问题呢?介绍一个关键字,final:最终。

  final特点:

    1:这个关键字是一个修饰符,可以修饰类,方法,变量。

    2:被final修饰的类是一个最终类,不可以被继承。

    3:被final修饰的方法是一个最终方法,不可以被覆盖。

    4:被final修饰的变量是一个常量,只能赋值一次。

 多态:函数本身就具备多态性,某一种事物有不同的具体的体现。

           多态在子父类中的成员上的体现的特点:

           成员变量:编译运行都看 = 左边。

           成员函数 :编译看 = 左边,运行看 = 右边。

           静态函数 :编译运行都看 = 左边。

 6.this代表对象。就是所在函数所属对象的引用。

    开发时,什么时候使用this呢?在定义功能时,如果该功能内部使用到了调用该功能的对象,这时就用this来表示这个对象。

    this 还可以用于构造函数间的调用。 调用格式:this(实际参数)

   this调用构造函数,必须定义在构造函数的第一行。因为构造函数是用于初始化的,所以初始化动作一定要执行。否则编译失败。

 7.Static

特点:

    想要实现对象中的共性数据的对象共享。可以将这个数据进行静态修饰

    静态随着类的加载而加载。而且优先于对象存在。

注意:

        静态方法只能访问静态成员,不可以访问非静态成员。因为静态方法加载时,优先于对象存在,所以没有办法访问对象中的成员。

       静态方法中不能使用this,super关键字。因为this代表对象,而静态在时,有可能没有对象,所以this无法使用。

成员变量和静态变量的区别:

 1,成员变量所属于对象。所以也称为实例变量。静态变量所属于类。所以也称为类变量。

   2,成员变量存在于堆内存中。静态变量存在于方法区(永久区)中。

   3,成员变量随着对象创建而存在。随着对象被回收而消失。静态变量随着类的加载而存在。随着类的消失而消失。

  4,成员变量只能被对象所调用 。静态变量可以被对象调用,也可以被类名调用。

  所以,成员变量可以称为对象的特有数据,静态变量称为对象的共享数据。

8.创建一个对象都在内存中做了什么事情?

    Person p = new Person();  

   1:先将硬盘上指定位置的Person.class文件加载进内存。

   2:执行main方法时,在栈内存中开辟了main方法的空间(压栈进栈),然后在main方法的栈区分配了一个变量p

   3:在堆内存中开辟一个实体空间,分配了一个内存首地址值。new

   4:在该实体空间中进行属性的空间分配,并进行了默认初始化。

   5:对空间中的属性进行显示初始化。

 6:进行实体的构造代码块初始化。

 7:调用该实体对应的构造函数,进行构造函数初始化。()

 8:将首地址赋值给p变量就引用了该实体。(指向了该对象)

9.初始化的总结

 方法的成员变量如果不给初始化会报错,但是类的成员变量是基本类型会默认给初始的值。如果是对象的引用就会是null.

 构造器初始化: 类成员变量的初始化是在构造器被调用之前发生的。

 初始化的顺序,在类的内部,变量定义的先后顺序,决定了初始化的顺序,他们会在任何方法,包括构造器被调用之前得到初始化,即使他们散布于方法定义之间。

静态数据的初始化:static不能用作局部的变量(这个不难理解,因为static作用的域是和类无关的),只能作用于域,如果一个域是静态的基本类型域,则他会获得基本类型的标准初始值,如果他是一个引用,这默认为nuLL

要加载main()方法,必须先加载他的这个类,加载这个类就会加载他的静态域,然后加载成员变量,然后是构造函数。静态域只会被加载一次。

初始化顺序:

普通类的初始化顺序

静态属性:static 开头定义的属性

静态方法块: static {} 圈起来的方法块

这里如果有main函数,则要在这里执行main函数,把main函数看场子类的静态方法就可以了。

普通属性: 未带static定义的属性

普通方法块: {} 圈起来的方法块

构造函数: 类名相同的方法

方法: 普通方法

静态优先父类优先

父类静态变量

父类静态代码块

子类静态变量

子类静态代码块

父类普通变量

父类普通代码块

父类构造函数

子类普通变量

子类普通代码块

子类构造函数

Mian()方法

 

抽象的实现子类: 接口 - 抽线类 - 实现类

接口静态变量

抽象类静态变量

抽象类静态代码块

实现类静态变量

实习类静态代码块

抽象类普通变量

抽象类普通代码块

抽象类构造函数

实现类普通变量

实现类普通代码块

实现类构造函数

数组的初始化:

   数组的定义方式 两种,初始化数组的时候都是相当于new的操作,直接赋值也是相当于new的一个操作,所以数组的new出来的数据应该在堆上面放着,而数组的引用应该在栈上面放着,所以数组的引用赋值给另一个引用的时候后他们指向的内存空间是一样的,即操作的数据是一样的。

枚举和switch诗一对组合,因为是要在有限的可能值集合中进行选择:
JDK1.5之前,switch循环只支持byte short char int四种数据类型.

JDK1.5 switch循环中增加了枚举类与byte short char int的包装类,对四个包装类的支持是因为java编译器在底层手动进行拆箱,而对枚举类的支持是因为枚举类有一个ordinal方法,该方法实际上是一个int类型的数值.

jdk1.7开始支持String类型,但实际上String类型有一个hashCode算法,结果也是int类型.byte short char类型可以在不损失精度的情况下向上转型成int类型.所以总的来说,可以认为switch中只支持int.

 


 

 

 


   

猜你喜欢

转载自blog.csdn.net/weixin_37650458/article/details/85239600