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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© sk120110 中级黑马   /  2014-7-8 01:50  /  2467 人查看  /  18 人回复  /   1 人收藏 转载请遵从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() {
                        super(); 
                        System.out.print("Z");
                }
                public static void main(String[] args) {
                        new Z();
                }
        }

输出结果是什么,求详细步奏

18 个回复

倒序浏览
子类对象的创建与实例化过程:首先,分配对象所需的全部内存空间,并初始化为0;然后,按继承关系,自顶向下显示初始化;最后,按继承关系,从顶向下调用构造方法。结果是YXYZ
回复 使用道具 举报
子类对象在实例化的过程中,首先会调用父类的构造方法,这里的super()有没有效果都是一样的,构造方法的作用就是对该类的属性初始化,只有父类都准备完毕以后才会调用子类的构造方法,实现子类属性的初始化
回复 使用道具 举报
主方法中new了Z,从Z开始看
Z方法从第一行执行,首先new出Y的对象,输出Y构造器中的Y
第二、三行Z构造器,因为继承X,super();会引用Z的父类X,而构造器优先于本方法中其他代码,X执行其自身的构造器,输出X,
然后父类X中new了Y,执行Y构造器,输出Y
第四行,啥也别说,直接输出Z
回复 使用道具 举报
醉、倾鯎 发表于 2014-7-8 10:31
主方法中new了Z,从Z开始看
Z方法从第一行执行,首先new出Y的对象,输出Y构造器中的Y
第二、三行Z构造器, ...

兄弟貌似也绕进去了,你这说法不对的。第一个Y是从X中new出来的,不信可以分别将X和Z中的new Y给注释掉,再输出结果看看
回复 使用道具 举报
ahuhxl 发表于 2014-7-8 11:17
兄弟貌似也绕进去了,你这说法不对的。第一个Y是从X中new出来的,不信可以分别将X和Z中的new Y给注释掉, ...

献丑了,看来我还得学习啊,debug了一下,发现跟自己想的不一样
回复 使用道具 举报
醉、倾鯎 发表于 2014-7-8 11:22
献丑了,看来我还得学习啊,debug了一下,发现跟自己想的不一样

交流就是学习嘛!互勉!
回复 使用道具 举报
ahuhxl 发表于 2014-7-8 11:25
交流就是学习嘛!互勉!

能不能详细解释下 super()这一步呢  不太懂

点评

super() 的意思就是指向父类,让程序执行到该行代码的时候,跳转到父类。  发表于 2014-7-8 22:06
回复 使用道具 举报
画图做这样的题目很简单,我花了图你看看就明白
C:\Users\Administrator\Desktop\未命名.bm
回复 使用道具 举报
C:\Users\Administrator\Desktop
回复 使用道具 举报
先吐槽下,真坑爹,图片一直传入失败,我就把我的作图思路下一下了,新手遇到这样的题目抓着就是画图。
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  
纯手打,看着会比较累,自己画图试试。

回复 使用道具 举报 2 0
人心如水 发表于 2014-7-8 13:37
先吐槽下,真坑爹,图片一直传入失败,我就把我的作图思路下一下了,新手遇到这样的题目抓着就是画图。
1, ...

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

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

额 YXYZ.....
回复 使用道具 举报
十指紧扣 来自手机 高级黑马 2014-7-9 00:02:23
16#
这题目拿来的呀………………………………
回复 使用道具 举报
还没看到这儿~
回复 使用道具 举报
....坑不坑在一线!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马