黑马程序员技术交流社区

标题: 这是父类和子类的初始化问题么 [打印本页]

作者: IT军犬    时间: 2016-10-20 16:40
标题: 这是父类和子类的初始化问题么
为什么输出是YXYZ,是怎么执行的呢
class X {
        Y b = new Y();
        X() {
                        System.out.print("X");
        }
}

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

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

        public static void main(String[] args) {
                        new Z();
                       //System.out.println("a");                 还有为什么这样的话只输出A

        }
}


作者: IT军犬    时间: 2016-10-22 14:49
沉了么??还不会啊  这个

作者: 小菜_一碟    时间: 2016-10-22 17:06
这个涉及到类的初始化过程及成员变量的初始化过程。
在类的的初始化过程中初始化的顺序是:
1、先给变量分配内存空间,初始化默认的值
2、进入构造函数,检查是否有this或者super调用(this调用是完成本类本身的构造函数之间的调用,super调用是完成对父类的调用)。在调用this和super的时候实现程序的跳转,转而执行被调用的this构造函数或者super构造函数。
3、在this和super执行完毕,程序转而执行在类定义的时候进行的变量初始化工作。这个执行完毕,才是构造函数中剩下的代码的执行。

所以你提供代码的执行顺序如下(说明:以下符号"::"前半部分内容代表类,后半部分内容代表类中的变量或函数):
1、Z::y = null;//设置默认值
2、X::y = null;//设置默认值(由类Z跳转到父类X)
3、X::y = new Y();//(X类中)真正的初始化赋值操作执行,打印“Y”
4、X::X();//继续完成X()中除this、super调用外的剩余操作,打印“X”
5、Z::y = new Y();//X初始化完成(即Zsuper操作完成),此时完成Z::y的真正初始化操作,打印“Y”
6、Z::Z();//继续完成Z()中除this、super调用外的剩余操作,打印“Z”

所以,最后完整打印就是“YXYZ”。
可以参考下http://www.blogjava.net/fhtdy2004/archive/2009/05/11/270110.html这篇博客的讲述。
作者: 读书可以当饭吃    时间: 2016-10-22 18:38
3楼正解,,




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2