运行下列的程序,最后的执行结果为:
class X{
public Y y=new Y();
public X(){
System.out.println("X");
}
}
class Y{
public Y(){
System.out.println("Y");
}
}
public class Z extends X {
public Y y=new Y();
public Z(){
System.out.println("Z");
}
public static void main(String[] args) {
new Z();
}
}
规则:
-
创建子类实例的时候,会先构造父类的实例(调用父类的构造方法)
-
初始化顺序:先执行就地初始化,再执行代码块,再执行构造方法
-
此题先从main方法开始
-
new Z() 的时候,就会先构造父类的实例,进入X中执行
-
构造X实例的时候,先就就地初始化,再调用构造方法,于是就进入到Y执行。
-
执行Y的构造方法,于是就打印Y
-
执行了X的构造方法,于是打印X
-
父类X已经准备就绪,于是开始准备Z的初始化
-
对于Z来说,也是先执行就地初始化,再调用构造方法。
-
就地初始化就是进入到Y执行,只需要调用构造方法即可,打印Y
-
然后执行Z自身的构造方法,打印Z