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();
}
}
------------------------------------------
执行结果:
Y
X
Y
Z
知识补充:
- new Z()这种形式,表示new出一个对象的地址没地方保存,待这行语句执行完毕之后,就立刻会被垃圾回收机制判定为垃圾随之被回收;
- 创建子类实例的时候,会先构造父类的实例(调用父类的构造方法);
- 初始化顺序:先执行就地初始化,再执行代码块,最后执行构造方法;
- 代码块执行顺序:static修饰的代码块(类加载时执行)执行始终在普通代码块(创建实例时)之前,类加载只执行一次。
过程分析:
- new Z()的时候,会先构造父类的实例,进入X中执行
- 构造X实例的时候,先就地初始化,再调用构造方法,于是进入Y执行
- 进入Y,执行Y的构造方法,打印了Y
- 执行完Y后,出来执行X的构造方法,打印了X
- 此时父类X已经准备就绪,开始执行子类Z的初始化
- 对于Z来说也是先执行就地初始化,再调用构造方法
- 就地初始化时进入Y执行,只调用了构造方法,打印了Y
- 接下来执行自己的构造方法,打印了Z
- 故结果为输出YXYZ



