黑马程序员技术交流社区

标题: 有点难度的题 大家看看 [打印本页]

作者: 屠赞华    时间: 2015-4-3 21:31
标题: 有点难度的题 大家看看
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


作者: liyanghml    时间: 2015-4-4 01:52
创建Z对象,Z继承X,X中又有Y对象:所以先输出父类:YX,
之后Z类中创建Y对象,再之后加构造函数:输出YZ

最终结果:YXYZ


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

太对了   老师就是这么讲的
作者: daveyang    时间: 2015-4-4 20:10
这个题很好,帮助理解Java的运行机制
作者: 杨大萌    时间: 2015-4-4 20:39
被采纳,有技术分没?
作者: long_yihuan    时间: 2015-4-5 13:33
调用子类的构造器之前先调用的是父类的构造器




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