黑马程序员技术交流社区

标题: 输出结果是YXYZ,为什么啊 [打印本页]

作者: 小漠    时间: 2014-10-5 20:26
标题: 输出结果是YXYZ,为什么啊
本帖最后由 小漠 于 2014-10-5 21:18 编辑

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();
        }
}
作者: 水竹    时间: 2014-10-5 20:36
这是基础视频里面第7天的内容,与你问题有关的是第4步的默认初始化和第7步的构造函数初始化。
此外还有一个知识点就是子类构造函数调用的时候默认先调用父类的无参构造函数,综合起来之就是那样了。

作者: liaorubei    时间: 2014-10-5 20:47
一个对象的实例化,如果有父类,并且子类的构造函数并没有显示调用父类的构造函数的话,会先运行父类的构造函数,然后调用子类的构造函数,如实例化Z时,先调用父类X的构造函数,然后调用Z类的构造函数,这里输出为XZ,
一个对象的实例化,也会为其内的成员变量进行初始化,并在调用构造函数之前,因为成员变量是和对象一起存在的,
所以X的成员变量Y和Z的成员变量Y都要初始化,因为你给Y的初始化值为new Y()所以又会调用Y的构造函数,所以打印的结果就是YXYZ(X中的Y变量赋值>X的构造函数>Z中的Y变量赋值>Z的构造函数)
作者: 小漠    时间: 2014-10-5 20:53
水竹 发表于 2014-10-5 20:36
这是基础视频里面第7天的内容,与你问题有关的是第4步的默认初始化和第7步的构造函数初始化。
此外还有一个 ...

  Y b = new Y();属于特有属性?
作者: 水竹    时间: 2014-10-5 20:55
小漠 发表于 2014-10-5 20:53
Y b = new Y();属于特有属性?

对,因为它前面没有写static,也就是说是每个该类的对象都有的,所以就是特有属性。
作者: 小漠    时间: 2014-10-5 21:02
liaorubei 发表于 2014-10-5 20:47
一个对象的实例化,如果有父类,并且子类的构造函数并没有显示调用父类的构造函数的话,会先运行父类的构造函 ...

好像明白了,谢谢~~:lol
作者: 光头强    时间: 2014-10-5 21:11
首先 , new Z ( ) , Z类的构造函数压栈 , 由因为Z继承X  X是父类  X的构造函数压栈  , X给对象进行初始化 , 首先 , new Y 类子类对象 , 输出Y , 他是X类的成员变量 , 而X类的构造函数只是简单的输出语句  , 并没有做别的事情 , 所以打印X , 父类已经给显示完毕   接下来我们该看子类的  , 子类又是先new Y的对象  , 输出Y , 构造函数输出Z   子类初始化完毕 , 打印结果YXYZ
作者: 小漠    时间: 2014-10-5 21:16
水竹 发表于 2014-10-5 20:55
对,因为它前面没有写static,也就是说是每个该类的对象都有的,所以就是特有属性。 ...

又看了一眼视频,把迷糊的终于明白了,谢谢~
作者: 小漠    时间: 2014-10-5 21:17
光头强 发表于 2014-10-5 21:11
首先 , new Z ( ) , Z类的构造函数压栈 , 由因为Z继承X  X是父类  X的构造函数压栈  , X给对象进行初始化 , ...

现在明白了,脑子转的慢,嘿嘿,非常感谢耐心讲解
作者: 18643448863    时间: 2014-10-5 21:29
果断没看懂,有看懂了的没? 写详细点 怎么个过程  
作者: 18643448863    时间: 2014-10-5 21:42
光头强 发表于 2014-10-5 21:11
首先 , new Z ( ) , Z类的构造函数压栈 , 由因为Z继承X  X是父类  X的构造函数压栈  , X给对象进行初始化 , ...

不是说子类构造函数的第一行 是默认的 super() 么 为啥你这个没有执行?
作者: 18643448863    时间: 2014-10-5 22:12
liaorubei 发表于 2014-10-5 20:47
一个对象的实例化,如果有父类,并且子类的构造函数并没有显示调用父类的构造函数的话,会先运行父类的构造函 ...

我一直在想 为什么是YXYZ,为什么不是YYXZ
作者: 水竹    时间: 2014-10-5 22:27
18643448863 发表于 2014-10-5 22:12
我一直在想 为什么是YXYZ,为什么不是YYXZ

先说你上一楼说的那句话,默认的super()当然执行了,要不执行的话就没X类什么事了。
然后说说调用一个构造函数要做什么事情。
构造函数是为了创建出一个新的对象,它当然不可能只执行了你在里面写的那句输出语句,因为它还要在堆里给新对象分配一个空间出来啊,这个空间分配出来之后,才是你自己写的用来初始化的语句,要不然的话你写个this.name="小明",这个"小明"要存在哪里?
而在分配空间这个过程中,其实分为好多步骤,其中有一步就是建立对象的特有属性,并进行默认初始化,也就是输出两个Y的那里。
算了,不说了,忽然没兴致了,真搞不懂那些管理员怎么评技术分的,我说的清清楚楚明明白白正正确确,还是在别人前面回答出来的,提问的得分了,后面回答的得分了,就我不得分,我贴了那么大张图在那里,说没看见骗鬼都不信!
没兴致了,不说了。
作者: 18643448863    时间: 2014-10-5 22:38
水竹 发表于 2014-10-5 22:27
先说你上一楼说的那句话,默认的super()当然执行了,要不执行的话就没X类什么事了。
然后说说调用一个构 ...

管理员的评分我来回答你吧,首先你在一楼的贴图 这些没有解决实际问题,就像我 你贴图里面的知识点 我都记得。也知道什么意思也知道 子类代码快中有默认的父类无参数代码块 但是还是不明白 整个过程 二楼晚了你一点 但是写的挺好的 至少 我一直在看二楼 根据二楼的思想去 思考 你之后给楼主解决问题 那个时候 更不用谈了 分开分部的解决问题 怎么给技术分? 每个回答都不完整  好像有个贴 写了 给技术分的规则 你可以去看看 是必须要 完整的 一次性解释好问题的 才给的
作者: 18643448863    时间: 2014-10-5 22:40
水竹 发表于 2014-10-5 22:27
先说你上一楼说的那句话,默认的super()当然执行了,要不执行的话就没X类什么事了。
然后说说调用一个构 ...

再说 一楼没解决问题 二楼解决了  管理还会看三楼么?
作者: 水竹    时间: 2014-10-5 22:55
18643448863 发表于 2014-10-5 22:38
管理员的评分我来回答你吧,首先你在一楼的贴图 这些没有解决实际问题,就像我 你贴图里面的知识点 我都 ...

你都记得你还不会那是你的问题,那是你不懂的地方,不是楼主不懂的地方,你跟楼主不懂的地方又不是一处。
我把图片里面的所有字自己打一遍回复出来他不给我技术分??难道回答的字数少就有问题??难道我就未卜先知应该知道其实你是更基础的地方不知道而不是更困难的地方不知道??
再者难道每个想获得技术分的人回答都要把特简单的问题说的冗长复杂?要是这样那有人问个java有什么特点是不是我要把所有Java的特性都说一遍才能得分??是不是回答个有关网络的细节问题我就要写篇七八百字的总结出来??
我另一个帖子里面也是只回复了两行,但是把楼主的问题解决了,而且还是第一个说出原因的,但是我下面那楼的哥们儿直接贴了个跟楼主问题屁事不关的代码,人家直接得了一分,那又是怎么回事?
作者: 水竹    时间: 2014-10-5 22:58
18643448863 发表于 2014-10-5 22:40
再说 一楼没解决问题 二楼解决了  管理还会看三楼么?

再说楼主是什么时候完全明白的?是不是又看了一眼视频?按照你的说法那怎么不给毕老师一分,毕竟他才是真正解决问题的人!
作者: 光头强    时间: 2014-10-6 21:15
小漠 发表于 2014-10-5 21:17
现在明白了,脑子转的慢,嘿嘿,非常感谢耐心讲解

不谢  大家一起学习  都是从你这个时候过来的  加油!!!
作者: 光头强    时间: 2014-10-6 21:19
18643448863 发表于 2014-10-5 21:42
不是说子类构造函数的第一行 是默认的 super() 么 为啥你这个没有执行?

不好意思  我说的有点快 我昨天说的是   Z类构造函数压栈   由因为Z继承X  X是父类  X的构造函数就压栈   这句话的意思就代表了 子类构造函数中的super( )    你说对吗????
           ------------------------------如果我说的不对请提醒我 ,谢谢  
作者: ς高眼光の目标    时间: 2014-10-7 02:27
学习了                     
作者: 于冬辉    时间: 2014-10-7 10:39
学习了也
作者: 戏言丶    时间: 2014-10-7 12:03
来学习一下啊
作者: wtjohn    时间: 2014-10-7 23:55
z extends x  
有默认的super () 所以先有x类中的y实例化(第一个Y),然后是x类构造方法输出(第二个位置的X), 然后又是Z类中有Y实例化,然后又是Z类自己的构造方法的输出(最后一个Z)   这样不就是YXYZ




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