黑马程序员技术交流社区

标题: 关于继承体系中super和this引用的疑问 [打印本页]

作者: Porsche911    时间: 2014-10-10 13:30
标题: 关于继承体系中super和this引用的疑问
本帖最后由 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就指向子类数据区。同样也希望高手来解答一下。

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

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

作者: Porsche911    时间: 2014-10-11 09:34
838598737 发表于 2014-10-10 23:30
super关键字与this关键字的区别:
        1. super关键字只能在继承的关系下才能使用,this关键字不需要继承照样 ...

还是感谢你能回复这么多。:D
作者: 迷失的小Z    时间: 2014-10-11 10:18
绕晕了……话说我这块学的稀里糊涂的……
作者: Porsche911    时间: 2014-10-15 11:43
哎,没人回复啊。。。。

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

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

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


作者: Porsche911    时间: 2014-10-15 20:45
cs8630323 发表于 2014-10-15 15:47
创建子类对象时不会创建父类对象,只是子类构造器调用了父类构造器。比如父类是抽象类,怎么能创建父类对象 ...

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

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

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

有兴趣看看,这个帖子http://bbs.csdn.net/topics/350165016,super不是引用,只是它的行为看起来像个应用,因此super是没有值得
作者: 暴风    时间: 2014-10-17 21:14
Porsche911 发表于 2014-10-17 08:54
有兴趣看看,这个帖子http://bbs.csdn.net/topics/350165016,super不是引用,只是它的行为看起来像个应 ...

是的!它不是一个常规的引用, [美] Bruce Eckel 说的也是个人理解,我的理解它是个特殊引用,有特殊的特征。




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