OOP 多态和构造器执行顺序
在java的面试题中,对象的初始化顺序配合多态是一种常见考题!今天我就来详细的回顾一下!
类中一般包括这几个部分:
- 静态成员 包括静态的成员变量 静态代码块、
- 非静态的成员变量
- 构造函数 (其实也是一种静态方法,只不过static是隐式的)
- 静态方法和非静态方法
Java尽力保证,所有变量在使用前都能得到恰当的初始化
方法的局部变量 java以编译时错误的形式来贯彻这种保证;而对于类的成员变量,如果是基本数据类型都保证会有一个默认值,如果是引用类型,未被初始化则会被赋值为Null!
静态成员—–>成员变量(相互之间按照定义顺序)—–>构造器等任何方法
初始化对象时,并不会执行静态方法。静态方法直接通过类名进行访问
对象的创建过程
以Dog类为例
1.即使没有显示的指定static关键字,构造器实际上也是静态方法。因此,当首次创建类型为Dog的对象(构造器可以看成静态方法),或者Dog的静态方法/静态域首次被访问时,java解释器必须查找类路径,以定位Dog.class文件
2.然后载入Dog.class,有关静态初始化的所有动作(静态成员变量 静态代码块)都会执行。因此,静态初始化只在class对象首次加载的时候进行一次。
3.当用new Dog()创建对象的时候,首先在堆上为Dog对象分配足够的存储空间。
4.这块存储空间将会被清零,这就自动的将Dog对象中的所有基本数据类型都设置为默认值,而引用则被设置为null
5.执行父类的构造函数,依次递归直到继承层级的根。首