Day0003:类的调用的顺序
微信公众号:DAMO小天天
代码
class X {
Y y = new Y();
public X() {
System.out.print("X");
}
}
class Y {
public Y() {
System.out.print("Y");
}
}
public class Z extends X {
Y y = new Y();
public Z() {
System.out.print("Z");
}
public static void main(String[] args) {
new Z();
}
}
答案
执行结果: YXYZ
分析与解答
初始化过程:
- 初始化父类中的静态成员变量和静态代码块;
- 初始化子类中的静态成员变量和静态代码块;
- 初始化父类的普通成员变量和代码块,再执行父类的构造方法;
- 初始化子类的普通成员变量和代码块,再执行子类的构造方法;
(1)初始化父类的普通成员变量和代码块,执行 Y y=new Y(); 输出Y
(2)再执行父类的构造方法;输出X
(3) 初始化子类的普通成员变量和代码块,执行 Y y=new Y(); 输出Y
(4)再执行子类的构造方法;输出Z
所以输出YXYZ
拓展
- 父类静态代码块 ( java虚拟机加载类时,就会执行该块代码,故只执行一次)
- 子类静态代码块 ( java虚拟机加载类时,就会执行该块代码,故只执行一次)
- 父类属性对象初始化
- 父类普通代码块(每次new,每次执行 )
- 父类构造函数(每次new,每次执行)
- 子类属性对象初始化
- 子类普通代码块(每次new,每次执行 )
- 子类构造函数(每次new,每次执行)
更多内容,公众号
想要关注等多内容,请微信搜索微信公众号:DAMO小天天