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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 屠赞华 中级黑马   /  2015-4-3 21:31  /  698 人查看  /  10 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

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();
        }
}
//答案是YXYZ

10 个回复

倒序浏览
创建Z对象,Z继承X,X中又有Y对象:所以先输出父类:YX,
之后Z类中创建Y对象,再之后加构造函数:输出YZ

最终结果:YXYZ

回复 使用道具 举报
先初始化父类
回复 使用道具 举报
首先,读到new z();记载z及其父类x进内存,访问隐式语句super();访问父类的初始化情况,初始化变量Y,打印y,初始化构造函数x(),打印x。然后要创建z对象,就先要初始化z的成员变量y,打印y,接着在构造函数内打印z
这就是new语句在内存中的操作流程。
回复 使用道具 举报
通过看运行指令:创建Z先执行了Y y = new Y(); 此时就创建Y对象,该对象因为也有子类,其会先创建X,打印:
YX,而后在调用Y的构造函数,打印Y,而后调用Z的,所以就是YXYZ
回复 使用道具 举报
顶一个                           
回复 使用道具 举报
最终结果:YXYZ
回复 使用道具 举报
杨大萌 发表于 2015-4-4 10:53
首先,读到new z();记载z及其父类x进内存,访问隐式语句super();访问父类的初始化情况,初始化变量Y,打印y ...

太对了   老师就是这么讲的
回复 使用道具 举报
这个题很好,帮助理解Java的运行机制
回复 使用道具 举报
被采纳,有技术分没?
回复 使用道具 举报
调用子类的构造器之前先调用的是父类的构造器
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马