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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© fyg408224345 中级黑马   /  2015-6-13 11:16  /  645 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

不多说,直接上代码
class X{
                Y b = new Y();
                X() {
                        super();
                        System.out.print("X");
                }
}
class Y {
        int a = 19;
        Y() {
                System.out.print("Y");
        }
}
public class Z extends X {
        Y y = new Y();
        Z() {
                super();
                System.out.print("Z");
        }
        public static void main(String[] args) {
                new Z();
        }
}

这个程序最后执行结果是什么?为什么会是这个结果?我分析结果是XZ。可程序运行结果却是YXYZ

3 个回复

倒序浏览
你的思路是对的,但是 源文件编译后,字节码文件里面将X类的b字段的初始化过程放到了X类的构造函数里面,同理,Z的字节码也是如此,所以,运行的时候,先是在堆内存中分配了X类与Z类声明的变量的空间 之后调用Z的构造函数进行初始化,第一步会跳到X的构造函数,由于此构造函数中会先创建Y对象返回引用给b字段赋值,所以会先打印Y 依次类推吧 所以结果就是YXYZ
回复 使用道具 举报
2楼说的很详细。赞一下!!!
回复 使用道具 举报
guiqulaixi 发表于 2015-6-13 15:20
你的思路是对的,但是 源文件编译后,字节码文件里面将X类的b字段的初始化过程放到了X类的构造函数里面,同 ...

谢谢哦。有点懂了。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马