先找主函数,主函数为静态的,那么他将第一个运行。主函数中 new Z( );,即建立一个Z的对象,此时注意到Z继承了X那么现到父类中执行建立父类成员变量--执行父类构造函数的过程。父类中有一句Y b = new Y( );,即先建立1个Y的对象,此时调用Y的构造函数输出一个Y。继续执行父类X中的构造函数,输出第二个X,父类中的成员变量和构造函数都执行完毕后返回子类Z执行本身的成员变量和构造函数; 即先执行Y y = new Y( );,又输出一个Y,再执行Z(){System.out.print("Z");}输出最后一个Z。到这里程序执行结束打印结果为YXYZ
疯狂java讲义p161(175/914)”普通初始化块,声明实例属性指定的默认值都可以认为是对象的初始化块代码,他们的执行顺序与源程序中的排列顺序相同。“
你代码里的“Y b = new Y( );”就等于{sop("Y")};这个初始化代码块。
你可以在这句话的前后句分别加上一个初始化块的{System.out.println("初始化带买块前/后")};来看效果。