搜索黑马前辈的帖子,有一篇正好有谈到这个问题 http://bbs.itheima.com/forum.php?mod=viewthread&tid=57820&reltid=95561&pre_thread_id=0&pre_pos=4&ext=
主要观点是:
当父类,和子类有Static时,先初始化Static,再初始化子类的Static,再初始化父类的其他成员变量->父类构造方法->子类其他成员变量->子类的构造方法。
父类上层还有父类时,总是先执行最顶层父类的Static-->派生类Static-->派生类Static-->.......-->子类Static-->顶层父类的其他成员变量-->父类构造方法--> 派生类的其他成员变量 --> 派生类构造方法--> ...............-->子类其他成员变量-->子类构造方法(摘自傲鸽的帖子)
其实继承父类,在实例化子类的时候,调用父类构造方法其实还隐含了一个信息,就是会初始化父类的变量。
这样说会更好:实例化子类,先实例化父类(而不单单说只调用父类构造方法)
所以我这个代码的正确执行顺序应该是
new Z();--->先实例化父类(执行Y b = new Y();输出:Y,然后输出X),然后回到X类中,执行Y y = new Y();输出Y,最后再执行Z类的自身的构造函数,输出Z