题目1(面试题):程序的输出结果是:为什么?
class X {
2 Y b = new Y();//1
3 X() {
4 System.out.print("X");//2
5 }
6}
7class Y {
8 Y() {
9 System.out.print("Y");
10 }
11}
12public class Z extends X {
13 Y y = new Y();//3
14 Z() {
15 System.out.print("Z");//4
16 }
17public static void main(String[] args) {
18 new Z();
19 }
20}
解答思路:
1.首先加载z.class,不过,在此之前会先加载父类X.class,X.class中并没有静态代码块,所以什么都不执行。
2.jvm执行main方法,运行new Z();
3.先将父类中定义的数据进行显示初始化,所以执行 Y b = new Y();输出Y。
4.再执行父类的构造方法,输出X;
5.再将子类中定义的变量进行显示初始化,输出Y
6.最后执行子类的构造代码块,输出Z
7.最终的顺序为:YXYZ
8.遇到extends,就要知道,先初始化父类数据,然后初始化子类数据。 分层初始化。
super在这里仅仅表示要先初始化父类数据。