黑马程序员技术交流社区

标题: 父类与子类的那些事,傻傻搞不清楚 [打印本页]

作者: 董赛媛    时间: 2013-5-31 12:59
标题: 父类与子类的那些事,傻傻搞不清楚
本帖最后由 董赛媛 于 2013-5-31 18:47 编辑

如果
class Fu
{}
class Zi extends Fu
{}
那么Zi z = new Zi();在创建了一个Zi对象之前是不是也在堆里创建了一个Fu对象呢???不然哪里的super引用呢,是吧
作者: a464538715    时间: 2013-5-31 13:03
不会 他只会调用父类的构造方法
作者: a464538715    时间: 2013-5-31 13:03
http://blog.csdn.net/yidinghe/article/details/3839483  可以参考这里
作者: 小石头39910    时间: 2013-5-31 15:47
不会创建的,如果是这样的原理的话父亲生了一个儿子,儿子创建一个对象又会创建一个父亲吗?这是不符合逻辑的啊
作者: 花心々小土豆    时间: 2013-5-31 16:05
new Zi(); 这句话就是给Zi实例对象分配堆空间。因为Zi继承Fu父类,所以,虚拟机首先加载Fu类到方法区,并在堆中为父类成员变量在子类空间中初始化。然后加载Zi类到方法区,为Zi类的成员变量分配空间并初始化默认值。将Zi类的实例对象地址赋值给引用变量z。
作者: 黄丽军    时间: 2013-5-31 16:09
super可以用于构造和引用父类,创建子类时默认使用super()构造了父类,当然,前提是父类必须有默认构造方法。如果你在Fu里面自定义了一个带有参数的构造方法,那么在Zi中就必须显示的用Super('参数')来构造父类,然后构造子类时就会通过子类构造方法中的Super('参数')语句构造父类。也就是说构造子类时一定会构造父类。楼上美女照片不错==
作者: 孙宁洋    时间: 2013-5-31 16:41
super的功能是调用父类中的成员属性和方法,继承的优点就在于此,可以不用创建父类就可拥有父类中属性和方法。super调用父类的构造方法时只能放在第一行。
作者: 董赛媛    时间: 2013-5-31 17:19
花心々小土豆 发表于 2013-5-31 16:05
new Zi(); 这句话就是给Zi实例对象分配堆空间。因为Zi继承Fu父类,所以,虚拟机首先加载Fu类到方法区,并在 ...

调用构造函数不就是创建一个对象吗 那调用了super();怎么就没有创建Fu类的对象呢?还是没搞明白
作者: 王瀛    时间: 2013-5-31 17:33
创建子类对象的时候,会参考父类的构造方法,即子类的构造函数第一句(第一行)都有一个隐式的super();


作者: 骑上最爱    时间: 2013-5-31 17:44
当然是先有的父了

你可以理解为,继承后子类中有一个父类,但是只能看到父类的除了私有以外的方法。


作者: 杨青    时间: 2013-5-31 17:44
super()是继承父类的方法和属性,创建对象还是子类自己。
作者: 董赛媛    时间: 2013-5-31 17:47
杨青 发表于 2013-5-31 17:44
super()是继承父类的方法和属性,创建对象还是子类自己。

亲,描述的不科学
作者: 董赛媛    时间: 2013-5-31 17:48
骑上最爱 发表于 2013-5-31 17:44
当然是先有的父了

你可以理解为,继承后子类中有一个父类,但是只能看到父类的除了私有以外的方法。

应该是子类有了父类的一个拷贝吧
作者: 骑上最爱    时间: 2013-5-31 17:55
你就认为子类中有个父类,想要调用子类的方法就用 this.  想要调用父类的方法就用 super.
作者: 董赛媛    时间: 2013-5-31 17:56
花心々小土豆 发表于 2013-5-31 16:05
new Zi(); 这句话就是给Zi实例对象分配堆空间。因为Zi继承Fu父类,所以,虚拟机首先加载Fu类到方法区,并在 ...

谢谢土豆,你的意思总算是看懂了,感觉是正解:victory:
作者: 花心々小土豆    时间: 2013-5-31 18:01
董赛媛 发表于 2013-5-31 17:19
调用构造函数不就是创建一个对象吗 那调用了super();怎么就没有创建Fu类的对象呢?还是没搞明白 ...

这么想吧,Zi和Fu是继承关系,不能说调用了super(),应该是访问了super()。Zi的所有构造方法体中都有一条隐式(或显式)语句super(),在对子类进行初始化时,执行到子类构造函数体中就会执行super()。
为啥访问super()??
因为Fu中有些初始化数据Zi可以直接获取,无需重新初始化。
作者: 花心々小土豆    时间: 2013-5-31 18:08
董赛媛 发表于 2013-5-31 17:56
谢谢土豆,你的意思总算是看懂了,感觉是正解

呵呵,有机会多交流,一起努力!




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