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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© Porsche911 中级黑马   /  2014-10-10 13:30  /  1797 人查看  /  11 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 Porsche911 于 2014-10-15 11:44 编辑

毕老师第七天第4个视频中讲到了在继承体系内,创建子类对象时内存分配的问题。

我有两个疑问:
1) 加载子类时,在方法区中为子类开辟空间,这个空间首先分为静态方法区和非静态方法区,然后非静态方法区中又分为子类区和父类区,子类区中除了子类的非静态方法以外,还有this和super两个引用。毕老师一直强调this和super分别是对子类对象和父类对象的引用,但是如果我在子类内部定义某个方法f(),在f()里面通过super关键字调用父类的某个方法,此时却并没有父类对象啊,super怎么会指向父类对象呢?我的理解是,调用父类方法时,super的值是方法区非静态方法区中父类区的地址值,此时通过super关键字指向该区,并调用该区内指定的父类方法。不知道这样理解对不对,希望高手解答。

2) 同样,我只创建子类对象,通过super关键字调用父类成员变量时,堆内存中到底有没有默认的创建父类对象呢?如果没有,super又怎么能指向父类对象呢?还是正像毕老师说的,当只创建子类对象后,在调用成员变量的时候,无论super还是this其实都是通过多态的形式指向了这个子类对象,只不过,如果使用super就是指向这个子类对象内的父类数据区,如果是this就指向子类数据区。同样也希望高手来解答一下。

上述仅仅是我的浅薄的理解,还望大家轻拍,拜托了。

评分

参与人数 1技术分 +1 收起 理由
杨佳名 + 1 赞一个!

查看全部评分

11 个回复

倒序浏览
super关键字与this关键字的区别:
        1. super关键字只能在继承的关系下才能使用,this关键字不需要继承照样可以使用。
        2. super关键字代表的是父类空间的引用。this代表的是所属函数 的调用者对象。
        3. super在子类的构造函数中是调用父类的构造函数,this关键字是构造函数中是调用本类的构造函数,
        4. super可以用作区分同名的子父类成员,可以指定访问父类的成员。 this关键字是用作区分同名的成员变量与局部变量的。
回复 使用道具 举报
838598737 发表于 2014-10-10 23:30
super关键字与this关键字的区别:
        1. super关键字只能在继承的关系下才能使用,this关键字不需要继承照样 ...

还是感谢你能回复这么多。:D
回复 使用道具 举报
绕晕了……话说我这块学的稀里糊涂的……
回复 使用道具 举报
哎,没人回复啊。。。。

不过至少有一点我还是弄懂了。《Java编程思想》里面是这么说的:当创建了一个子类对象时,该对象包含了一个父类的子对象。这个子对象与用父类直接创建的对象时一样的。二者的区别在于,后者来自于外部,而父类的子对象包含在子类对象内部。因此,super指向父类对象就可以理解了,也就说当仅仅创建了子类对象的时候,无论this还是super都是指向了堆内存中的同一个对象,只不过,使用super的时候就会调用对象内的父类数据,this就默认的调用了子类数据。

再有,我还在CSDN论坛中,得到这么一条信息:其实super不是真正意义上的引用,仅仅是“看起来像一个引用”,换句话说,super没有对应的值(对象的地址值),可能(个人猜测)是通过this指向堆内存子类对象的同时,通过super关键字专门调用父类数据而已。不知道是不是确实如此。。。。。
回复 使用道具 举报 1 0
本帖最后由 cs8630323 于 2014-10-15 16:08 编辑

创建子类对象时不会创建父类对象,只是子类构造器调用了父类构造器。比如父类是抽象类,怎么能创建父类对象呢。
你说f()内使用super调用父类方法没有父类对象,你创建子类对象调用f()时不就有了,和this一样意思
这句         毕老师一直强调this和super分别是对子类对象和父类对象的引用   和   super还是this其实都是通过多态的形式指向了这个子类对象   
是矛盾的吧,老毕的视频也忘了怎么说的反正我理解就是子类继承所有非私有成员,super是区分方法覆盖前后

回复 使用道具 举报
cs8630323 发表于 2014-10-15 15:47
创建子类对象时不会创建父类对象,只是子类构造器调用了父类构造器。比如父类是抽象类,怎么能创建父类对象 ...

”你说f()内使用super调用父类方法没有父类对象,你创建子类对象调用f()时不就有了,和this一样意思“,这句我没有理解,创建子类对象调用f()时就有什么了?父类对象?

那我们还是回到最初的问题,除非用类名调用方法,否则只能通过对象调用方法,这没有错吧?那通过super调用父类方法,这个super到底是什么?它总得是个对象吧?

确实,如果是抽象父类确实不能创建对象,但是《Java编程思想》里面就是这么说的,我也不知道它说的对不对,但至少可以自圆其说。
回复 使用道具 举报
那个地方打错了,super,我认为是子类的对象的指引,创建子类对象时不会创建父类对象,这个指引调用了子类继承父类的方法(未重写那个)
回复 使用道具 举报
暴风 中级黑马 2014-10-15 23:38:51
9#
这个问题,我曾经也思考过很长时间,我的见解是:super 和 this ,都是一个预备引用,在加载过程中,Java虚拟机会根据类与类之间的结构隐式的创建this和super,在逻辑上提供类之间在未创建对象时就可以有调用的可能。this和super,在还没有实例化对象前,都是待定赋值的;在对象产生时,其地址立即被赋予super和this。我觉得这两个可以理解为模型,模型在没有具体实体时,也可以进行代表实体操作的。至于this为何可以当一个变量赋值给其它变量,而super则不能,个人理解为super被虚拟机定义为一个final修饰的量。
回复 使用道具 举报
来学习学习
回复 使用道具 举报
暴风 发表于 2014-10-15 23:38
这个问题,我曾经也思考过很长时间,我的见解是:super 和 this ,都是一个预备引用,在加载过程中,Java虚 ...

有兴趣看看,这个帖子http://bbs.csdn.net/topics/350165016,super不是引用,只是它的行为看起来像个应用,因此super是没有值得
回复 使用道具 举报
暴风 中级黑马 2014-10-17 21:14:45
12#
Porsche911 发表于 2014-10-17 08:54
有兴趣看看,这个帖子http://bbs.csdn.net/topics/350165016,super不是引用,只是它的行为看起来像个应 ...

是的!它不是一个常规的引用, [美] Bruce Eckel 说的也是个人理解,我的理解它是个特殊引用,有特殊的特征。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马