2 li 13579 li li_13579_li 于 2017.01.12 08:12 提问

Java-继承:(如图)程序这样执行的顺序为什么是错误的

图片说明

3个回答

u010528826
u010528826   2017.01.12 11:29
已采纳

首先要知道构造方法执行时会首先隐式调用super(),然后隐式的将非静态成员变量进行初始化,最后才是执行构造块里面的代码。
由此分析上面代码。当你在main里面实例化Z的时候,发现Z extends X,所以会调用X的构造方法,实例化X。
实例化X的时候发现有非静态成员变量Y,则初始化Y,所以会调用Y的构造方法,实例化Y,则打印"Y",Y里面没其他东西所以所以没有其他输出,至此X里面的Y实例化完成。
然后继续实例化X,执行X构造方法里面的代码,则打印“X”,至此X实例化完成。
然后继续实例化Z,发现有非静态成员变量Y,则初始化Y,所以会调用Y的构造方法,实例化Y,则打印"Y",Y里面没其他东西所以所以没有其他输出,至此Z里面的Y实例化完成。
然后继续实例化Z,执行Z构造方法里面的代码,则打印“Z”,至此Z实例化完成。
所以你上面代码的打印应该是:YXYZ。说的有些啰嗦,将上面代码稍微改了下,验证上述过程:

 class X {
    Y y = new Y(1);

    X() {
        System.out.println("X");
    }

}

class Y {
    Y(int i) {
        System.out.println("Y" + i);
    }

}

class Z extends X {
    Y y = new Y(2);

    Z() {
        System.out.println("Z");
    }

    public static void main(String[] args) {
        new Z();
    }
}

输出结果:Y1 X Y2 Z

u010528826
u010528826 这篇博客将类加载过程和对象的创建过程总结了,你看看参考一下:http://blog.csdn.net/u014338577/article/details/49968253
11 个月之前 回复
li_13579_li
li_13579_li 谢谢:这体现的知识点是:类的初始化过程:成员变量->构造函数->成员方法 吗?
11 个月之前 回复
yy8093
yy8093   2017.01.12 09:04

X类里面的 Y b = new Y()也会执行

danielinbiti
danielinbiti   Ds   Rxr 2017.01.12 09:58
 成员变量在构造函数内部代码执行前初始化。也就是Y y = new Y()都比自身所在类的构造删除输出前执行。
 所在在按照父类构造函数先执行,子类构造函数后执行的时候,在每个构造函数执行时,把上面这点意外加进去就行了。
Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!