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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

为什么输出是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

        }
}

3 个回复

倒序浏览
沉了么??还不会啊  这个
来自宇宙超级黑马专属安卓客户端来自宇宙超级黑马专属安卓客户端
回复 使用道具 举报
这个涉及到类的初始化过程及成员变量的初始化过程。
在类的的初始化过程中初始化的顺序是:
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这篇博客的讲述。
回复 使用道具 举报
3楼正解,,
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马