这牵扯到JVM的运行流程,大致流程是这样的:
(流程1)先初始化静态:先父静态,再子静态;
(流程2)先父后子,先父的全部,然后子的全部;
(3)优先级:父类大于子类。静态代码块>非静态代码块>构造函数(与位置的前后无关)。
知道了上面的规则,然后分析:
1、程序以main()为入口,new Z();jvm查看程序发现没有静态变量或者静态代码块(流程1),此时就会想要调用类Z的构造函数进行进行初始化,然后发现Z是有父类的,这时候就(流程2)初始化父类的全部,程序上下执行,执行类X的 Y b = new Y();然后就调用了
类Y的构造器,输出了Y;
2、然后还是(流程2)未完的构造函数,此时输出X,此时父类的所有东西已经初始化完成了;
3、接着还是(流程2)执行子类Z的Y y = new Y(); 此时输出Y;
4、还是(流程2)执行子类的构造函数,输出Z
楼主可以试试断点调试,验证一下。是不是这样的流程的。
|