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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 董赛媛 中级黑马   /  2013-5-31 12:59  /  1426 人查看  /  16 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 董赛媛 于 2013-5-31 18:47 编辑

如果
class Fu
{}
class Zi extends Fu
{}
那么Zi z = new Zi();在创建了一个Zi对象之前是不是也在堆里创建了一个Fu对象呢???不然哪里的super引用呢,是吧

评分

参与人数 1技术分 +1 收起 理由
刘胜寒 + 1

查看全部评分

16 个回复

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

调用构造函数不就是创建一个对象吗 那调用了super();怎么就没有创建Fu类的对象呢?还是没搞明白
回复 使用道具 举报
王瀛 高级黑马 2013-5-31 17:33:06
9#
创建子类对象的时候,会参考父类的构造方法,即子类的构造函数第一句(第一行)都有一个隐式的super();

回复 使用道具 举报
当然是先有的父了

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

回复 使用道具 举报
super()是继承父类的方法和属性,创建对象还是子类自己。
回复 使用道具 举报
杨青 发表于 2013-5-31 17:44
super()是继承父类的方法和属性,创建对象还是子类自己。

亲,描述的不科学
回复 使用道具 举报
骑上最爱 发表于 2013-5-31 17:44
当然是先有的父了

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

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

谢谢土豆,你的意思总算是看懂了,感觉是正解:victory:
回复 使用道具 举报
董赛媛 发表于 2013-5-31 17:19
调用构造函数不就是创建一个对象吗 那调用了super();怎么就没有创建Fu类的对象呢?还是没搞明白 ...

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

呵呵,有机会多交流,一起努力!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马