class X {
Y b = new Y();
X() {
System.out.println("X");
}
}
class Y {
Y() {
System.out.println("Y");
}
}
class Z extends X {
Y b = new Y();
Z() {
System.out.println("Z");
}
public static void main(String[] args) {
Z z=new Z();
}
}输出的结果是YXYZ
为什么会输出Y
Y b = new Y();
X() {
System.out.println("X");
}
}
class Y {
Y() {
System.out.println("Y");
}
}
class Z extends X {
Y b = new Y();
Z() {
System.out.println("Z");
}
public static void main(String[] args) {
Z z=new Z();
}
}输出的结果是YXYZ
为什么会输出Y
先执行main方法,执行到new Z()时,先对Z的成员变量初始化,而Z继承自X,因此先对X的成员变量进行初始化,然后才能调用X的构造。
所以先对X类的成员变量b进行初始化,调用的Y的构造方法,打印Y,然后再调用X的构造方法打印X。
接下来就是子类的成员变量b进行初始化,同理也要先调用Y的构造打印出Y,最后才调用Z的构造打印Z
这里b是一个成员变量,是Y类型的,初始化的时候必然调用Y的构造方法。
new的时候应该是先调用构造方法中的super()初始化父类,再初始化成员变量,最后再调构造方法中的其它东西。这个例子里边new Z(),先调super()初始化x,x中先初始化成员变量。再执行x().然后z初始化成员变量,再调z().