黑马程序员技术交流社区

标题: 关于多态访问子父类中同名成员变量 [打印本页]

作者: amen0205    时间: 2013-3-5 21:53
标题: 关于多态访问子父类中同名成员变量
本帖最后由 门文通 于 2013-3-8 03:40 编辑

在多态中,如果子父类中有同名非私有成员变量,访问时要看左边(即引用型变量的类型)来确定调用哪个成员变量。   我认为 Fu f=new Zi(); 的过程中是没有创建父类对象的,不过刚才有同学说会隐式的创建父类对象。
  1. 在类与类之间的继承中,当我们用父类的引用指向子类对象时,这个引用也就指向子类对象中的父类对象

  2. Java引用变量有两个类型,一个是编译时的类型,一个是运行时的类型。编译时的类型是由声明该变量时使用的类型决定,运行时类型由实际赋给该变量的对象决定。通过引用变量来访问其包含的实列属性时,系统总是试图访问它编译时类所定义的属性。而不是它运行时类型所定义的属性。

  3. 在Java程序创建某个类的对象时系统会隐身创建该类父类的对象。只要有一个子类对象存在,则一定存在一个与之对应的父类对象。

复制代码
我对着不太明白了  ,毕老师视频里说的是  new Zi()  的时候  两个同名变量都会在堆中,只是父类引用调用时就会返回父类的变量。那我认为父类对象应该是不存在的。

到底父类对象有没有?   如果真有的话?  那对于抽象类和接口怎么办?  
作者: 杜超    时间: 2013-3-5 22:20
Fu f=new Zi(); 是父类引用指向了子类对象,这个过程中,是指向,代表对象已存在的。具体返回值看情况,多态中,成员变量和静态函数编译运行都看左边;成员函数编译看左边,运行看右边。遇到多态只要记住这个结论就可以了!
子类继承父类,父类的对象,子类不是重载就是覆盖,不用考虑父类对象是否存在。单继承多实现吗,子类需要实现接口和抽象类,跟父类有没有对象是没关系的。
作者: 疯子    时间: 2013-3-5 23:24
楼上正解。
作者: amen0205    时间: 2013-3-5 23:29
杜超 发表于 2013-3-5 22:20
Fu f=new Zi(); 是父类引用指向了子类对象,这个过程中,是指向,代表对象已存在的。具体返回值看情况,多 ...

结论我懂  方法会用  就是看到有人说  父类对象会隐式创建  这里不明白  
作者: 谢洋    时间: 2013-3-6 00:05
门文通 发表于 2013-3-5 23:29
结论我懂  方法会用  就是看到有人说  父类对象会隐式创建  这里不明白

这该是所谓的隐式父类对象吧

初始化.png (22.13 KB, 下载次数: 48)

初始化.png

作者: amen0205    时间: 2013-3-6 00:55
谢洋 发表于 2013-3-6 00:05
这该是所谓的隐式父类对象吧

我说的是多态 你这个图是子类对象实例化  不过意思上差不多了

这个意思是隐式父类对象时存在的? 好像是吧  
作者: 杜超    时间: 2013-3-6 08:11
门文通 发表于 2013-3-5 23:29
结论我懂  方法会用  就是看到有人说  父类对象会隐式创建  这里不明白

父类里的内容是共性内容,但子类含有自己特有的属性
Fu f=new Zi(); 中new Zi();表示new 一个子类的对象,因为子类 里面含有父类里的共性内容(继承父类里的内容),所以就是间接的创建了父类里的内容(父类的对象),也叫所谓的隐式创建父类对象。

这样楼主能明白吗?可以简单理解为:父类的内容子类里都有,直接创建子类对象会间接创建父类对象。
作者: amen0205    时间: 2013-3-6 19:28
杜超 发表于 2013-3-6 08:11
父类里的内容是共性内容,但子类含有自己特有的属性
Fu f=new Zi(); 中new Zi();表示new 一个子类的对象 ...

OK    其实能明确了  隐式父类是存在的 该理解还是能理解的   我一开始就是不确定 隐式父类存不存在




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