Java类的加载和成员变量初始化,创建对象的顺序。
-
class X {
-
Y b=
new Y();
-
X() {
-
System.out.println(
"X");
-
}
-
}
-
class Y {
-
Y() {
-
System.out.println(
"Y");
-
}
-
}
-
public
class Z extends X {
-
Y y=
new Y();
-
Z() {
-
super();
-
System.out.println(
"Z");
-
}
-
public static void main(String[] args) {
-
new Z();
-
}
-
}
-
//YXYTest
以上代码输出结果为YXYZ
看以看出,public类加载后并没有初始化成员变量y。在main方法使用new Z()创建对象时,先去构建class X父类对象,此时父类X的成员变量初始化输出Y,然后构造方法输出X,以后再进行class Z中y成员变量初始化输出Y,紧接着Z()中的输出语句输出Z。
网上找来的,可能是最好的解释了。
-------------------------------------------------------------------------------------------------------
在类被继承的情况下,初始化的顺序:
1.初始化子类,类加载器在加载它的时候会发现它继承了另外一个类,类加载器要先把父类加载进来。于是开始加载父类,父类的静态部分被按顺序加载。之后子类的静态部分被加载。这样的顺序是考虑子类的静态域可能会依赖父类的静态域;
2.父类的非静态部分被加载;
3.子类指定的父类的构造器;
4.子类的非静态部分被加载;
5.子类构造器的其余部分。
------------------------------------------------------------------------------------------------