黑马程序员技术交流社区

标题: 求助,坑爹题目 [打印本页]

作者: sk120110    时间: 2014-7-8 01:50
标题: 求助,坑爹题目
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() {
                        super(); 
                        System.out.print("Z");
                }
                public static void main(String[] args) {
                        new Z();
                }
        }

输出结果是什么,求详细步奏
作者: ahuhxl    时间: 2014-7-8 08:47
子类对象的创建与实例化过程:首先,分配对象所需的全部内存空间,并初始化为0;然后,按继承关系,自顶向下显示初始化;最后,按继承关系,从顶向下调用构造方法。结果是YXYZ
作者: 001可望成功    时间: 2014-7-8 09:29
子类对象在实例化的过程中,首先会调用父类的构造方法,这里的super()有没有效果都是一样的,构造方法的作用就是对该类的属性初始化,只有父类都准备完毕以后才会调用子类的构造方法,实现子类属性的初始化
作者: 醉、倾鯎    时间: 2014-7-8 10:31
主方法中new了Z,从Z开始看
Z方法从第一行执行,首先new出Y的对象,输出Y构造器中的Y
第二、三行Z构造器,因为继承X,super();会引用Z的父类X,而构造器优先于本方法中其他代码,X执行其自身的构造器,输出X,
然后父类X中new了Y,执行Y构造器,输出Y
第四行,啥也别说,直接输出Z

作者: ahuhxl    时间: 2014-7-8 11:17
醉、倾鯎 发表于 2014-7-8 10:31
主方法中new了Z,从Z开始看
Z方法从第一行执行,首先new出Y的对象,输出Y构造器中的Y
第二、三行Z构造器, ...

兄弟貌似也绕进去了,你这说法不对的。第一个Y是从X中new出来的,不信可以分别将X和Z中的new Y给注释掉,再输出结果看看
作者: 醉、倾鯎    时间: 2014-7-8 11:22
ahuhxl 发表于 2014-7-8 11:17
兄弟貌似也绕进去了,你这说法不对的。第一个Y是从X中new出来的,不信可以分别将X和Z中的new Y给注释掉, ...

献丑了,看来我还得学习啊,debug了一下,发现跟自己想的不一样
作者: ahuhxl    时间: 2014-7-8 11:25
醉、倾鯎 发表于 2014-7-8 11:22
献丑了,看来我还得学习啊,debug了一下,发现跟自己想的不一样

交流就是学习嘛!互勉!
作者: mirror    时间: 2014-7-8 12:40
ahuhxl 发表于 2014-7-8 11:25
交流就是学习嘛!互勉!

能不能详细解释下 super()这一步呢  不太懂
作者: 人心如水    时间: 2014-7-8 13:08
画图做这样的题目很简单,我花了图你看看就明白
C:\Users\Administrator\Desktop\未命名.bm
作者: 人心如水    时间: 2014-7-8 13:11
C:\Users\Administrator\Desktop
作者: 人心如水    时间: 2014-7-8 13:37
先吐槽下,真坑爹,图片一直传入失败,我就把我的作图思路下一下了,新手遇到这样的题目抓着就是画图。
1,首先看main方法在哪个类里面,JVM加载Z.class进方法区,并且进行空间分配,执行静态方法,静态成员变量默认和显示初始化(没有就不执行),再就是静态代码块的执行(没有不执行,记住只执行一次);
2,从程序入口main方法开始,里面new了对象Z,把对象加载到堆内存里面,开辟空间给地址值(记住堆内存里面都是地址值),看是否有成员变量,并且默认初始化,发现题目里有成员变量y,默认为null,接着找Z的构造函数来给对象初始化。
3,找到构造函数Z(),构造函数里面都有默认的4个步骤,必须严格执行1,执行super()初始化。2,执行成员变量显示初始化   3,执行构造代码块初始化 4,执行构造函数自定义内容初始化
4,知道步骤后,我们先执行Z()里的super(),Z继承X,找X里面的构造函数X(),里面同样有上面的4步骤,super()忽略,成员变量b显示初始化new Y(),调用Y构造,输出Y,X类里面没有构造代码块,接着执行X构造里面的自己的内容,即输出了X
5,super()执行完成后,给Z成员变量显示初始化,同上,默认为null初始为Y的构造输出Y,Z类里面也没有构造代码块,不执行。
6,执行最后一步,构造方法里面的内容,即输出Z
综上  输出Y X Y Z  
纯手打,看着会比较累,自己画图试试。


作者: 西地那非    时间: 2014-7-8 21:36
人心如水 发表于 2014-7-8 13:37
先吐槽下,真坑爹,图片一直传入失败,我就把我的作图思路下一下了,新手遇到这样的题目抓着就是画图。
1, ...

好像理解了
作者: mirror    时间: 2014-7-8 22:20
人心如水 发表于 2014-7-8 13:37
先吐槽下,真坑爹,图片一直传入失败,我就把我的作图思路下一下了,新手遇到这样的题目抓着就是画图。
1, ...

547150018 这是我的qq 求加好友   有些java得向你请教 了
作者: sk120110    时间: 2014-7-8 22:31
现在懂了。我是卡在了X构造函数那儿了,原来还要先初始化变量,那就懂了YXYZ
作者: 導ぷ仙″兲蕐    时间: 2014-7-8 22:50
本帖最后由 導ぷ仙″兲蕐 于 2014-7-8 22:55 编辑

额 YXYZ.....
作者: 十指紧扣    时间: 2014-7-9 00:02
这题目拿来的呀………………………………
作者: 韩天雷    时间: 2014-7-9 01:14
还没看到这儿~
作者: Solomon    时间: 2014-7-9 08:15
....坑不坑在一线!




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