A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

帮忙看下  为什输出的是YXYZ  十分感谢 我想了半天没想通

public class Test4 {
        public static void main(String[] args) {
                new Z();
}
}
class X {
        Y b = new Y();
        X() {
                        System.out.print("X");
        }
}

class Y {
        Y() {
                        System.out.print("Y");
        }
}

class Z extends X {
        Y y = new Y();
        Z() {
                        System.out.print("Z");
        }

       
}

6 个回复

倒序浏览
首先你得知道程序是依次执行的.从左到右,从上往下
现在我们来分析下:
1.在主方法中new了一个z,那我们就去找这个z,然后我们又看见了z是继承了x的,所以又要去找x,在x中还有一个new y,所以我们又要去找y,找到y中有一个输出y的,所以最先输出的是y;输出y后.x中的y就执行完了,然后往下执行,看见了x,所以就执行x,输出x;x执行完就没有了,所以我们又回到z,在z中,我们又看见了一个new y,所以又直接去找y,然后输出y,当y输出完后,又往下执行,就是最后的z了,最后输出z...可否明白???
回复 使用道具 举报
啊,,,楼主,,我也是才学,,,也是这里比较糊涂,我是这样理解的,,不知道对不对,不过重在交流。。。

第一步: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

点评

如果子父类加上静态代码块勒?  发表于 2016-6-18 21:53
回复 使用道具 举报 1 0
子类对象在实例化时会默认先去调用父类的无参构造方法,之后在调用本类之中的相应的构造方法
回复 使用道具 举报
ab159263487 发表于 2016-6-17 22:57
啊,,,楼主,,我也是才学,,,也是这里比较糊涂,我是这样理解的,,不知道对不对,不过重在交流。。。 ...

谢谢 感觉你说的挺好 讲的也很清楚
回复 使用道具 举报
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(); 语句在子类静态代码块后执行.
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马