第一步:main方法里面new Z();。。需要创建Z这个类的匿名对象,但是Z这个类是继承自X类的。所以第一步会先加载父类X类;
第二步:加载X类的时候类的成员变量会随之加载,会先执行X类中的 Y b = new Y();,创建Y类的对象Y类是一个单独的类,没有继承谁,也没有成员变量所以执行Y类的构造方法,输出“Y”
第三步:这时候X类中的成员变量显式初始化完毕,才回执行X类中的构造方法,输出"X"
第四步:现在才算是把X类这个父类加载完毕,随后开始加载子类Z类,同理先对Z的成员变量进行默认初始化和显示初始化,执行 Y y = new Y();,输出“Y”
第五步:Z类成员变量显式初始化完毕,执行Z的构造方法,,输出"Z"
输出是YXYZ作者: TCK8888 时间: 2016-6-17 23:00 子类对象在实例化时会默认先去调用父类的无参构造方法,之后在调用本类之中的相应的构造方法作者: tianzhu2725 时间: 2016-6-18 19:33
谢谢 感觉你说的挺好 讲的也很清楚作者: 大笑哈哈 时间: 2016-6-18 22:24
1,new Z(); 加载Z类时发现Z继承了X类 所以先加载X类,发现没静态相关,X类加载完成 然后加载Z类(不会加载属性)
2,执行new Z(); 先对父类初始化 , (默认),初始化属性发现Y b = new Y(); 输出Y 属性加载玩最后执行父类构造对属性进行显示初始化 输出 X
3,父类初始化完成 子类初始化 ,加载,(默认)初始化属性 Y b = new Y(); 输出Y 最后执行子类构造 进行显示初始化 输出Z
楼上说的有误差,可在父类 Y b = new Y(); 后面加上静态代码块 子类也加上静态代码块 然后测试 , 结果是Y b = new Y(); 语句在子类静态代码块后执行.