Java中一个对象的构造过程如下:
1-6属于初始化静态部分,如果一个类的静态部分已经初始化了(已经被类加载器加载了),就不会再重复初始化静态部分,静态部分的初始化只会在类加载器加载一个类的时候初始化一次。
1.用类加载器加载父类,按父类静态变量定义的顺序的为父类所有静态变量分配空间,并赋予父类静态变量默认值。
2.用类加载器加载自己,按自己静态变量定义的顺序的为自己所有静态变量分配空间,并赋予自己静态变量默认值。
3.按父类静态变量定义的顺序的为父类所有静态变量赋上定义的值。
4.执行父类静态代码块。
5.按自己静态变量定义的顺序的为自己所有静态变量赋上定义的值。
6.执行自己静态代码块。
7-14属于初始化实例部分。
7.为父类实例变量分配空间,并赋予默认值。
8.为自己实例变量分配空间,并赋予默认值。
9.按父类实例变量定义的顺序的为父类所有实例变量赋上定义的值。
10.执行父类的构造代码块。
11.执行父类的构造方法。
12.按自己实例变量定义的顺序的为自己所有实例变量赋上定义的值。
13.执行自己的构造代码块。
14.执行自己的构造方法。
对象构造完成!
注意:
1.父类如果还有父类就也依照此顺序先初始化父类的父类,直到Object为止。
2.如果执行步骤3、5、9、12时,定义的值引入了别的类,则会初始化那个类,如果引用的类还有引用的类则也按照此顺序先初始化引用类的引用类,直到所有被引用的类全部被初始化完毕为止。
3.如果一个类没有父类(如Object类),则它的初始化顺序可以简化成2、5、6、8、12、13、14。
4.如果这个类已经被类加载器加载过了,也就是该类的静态部分已经初始化过了,那么1、2、3、4、5、6都不会执行,总的顺序可以简化为7、8、9、10、11、12、13、14。
5.如果这个类没有被类加载器加载,但它的父类已经被类加载器加载过了,那么总的顺序可以简化为2、5、6、7、8、9、10、11、12、13、14。
执行以下代码:
public class A {
public A() {
init();
}
public void init() {
}
public static void main(String[] args) {
B b = new B();
System.out.println("最终i的值为:" + b.i + ",j的值为:" + b.j);
}
}
class B extends A {
int i;
int j = 999;
public void init() {
System.out.println("此时A的构造方法正在调用此方法:i的值为:" + i + ",j的值为:" + j);
i = 888;
j = 111;
}
}
打印结果:
此时A的构造方法正在调用此方法:i的值为:0,j的值为:0
最终i的值为:888,j的值为:999
转载请标明原地址,请尊重原创,谢谢。