这个涉及到类的初始化过程及成员变量的初始化过程。
在类的的初始化过程中初始化的顺序是:
1、先给变量分配内存空间,初始化默认的值
2、进入构造函数,检查是否有this或者super调用(this调用是完成本类本身的构造函数之间的调用,super调用是完成对父类的调用)。在调用this和super的时候实现程序的跳转,转而执行被调用的this构造函数或者super构造函数。
3、在this和super执行完毕,程序转而执行在类定义的时候进行的变量初始化工作。这个执行完毕,才是构造函数中剩下的代码的执行。
所以你提供代码的执行顺序如下(说明:以下符号"::"前半部分内容代表类,后半部分内容代表类中的变量或函数):
1、Z::y = null;//设置默认值
2、X::y = null;//设置默认值(由类Z跳转到父类X)
3、X::y = new Y();//(X类中)真正的初始化赋值操作执行,打印“Y”
4、X::X();//继续完成X()中除this、super调用外的剩余操作,打印“X”
5、Z::y = new Y();//X初始化完成(即Zsuper操作完成),此时完成Z::y的真正初始化操作,打印“Y”
6、Z::Z();//继续完成Z()中除this、super调用外的剩余操作,打印“Z”
所以,最后完整打印就是“YXYZ”。
可以参考下http://www.blogjava.net/fhtdy2004/archive/2009/05/11/270110.html这篇博客的讲述。 |