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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 逍遥小seng 中级黑马   /  2014-10-17 18:20  /  1469 人查看  /  12 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

为什么用父类引用建了子类的对象,却不能访问子类中特有的内容,不都是建立的子类对象吗,子类对象不是能访问子类的所有内容吗?理解不了,谁帮解释下!

评分

参与人数 1黑马币 +1 收起 理由
杨佳名 + 1

查看全部评分

12 个回复

倒序浏览
父类中没有定义的不能调用,因为此时是父类引用,你要调用,只能先向下转型,就是先转换成子类类型,才能调用子类中特有的。
视频中有讲过毕老师和毕老师的父亲的例子,当多态时,也就是父类引用指向子类对象的时候,就是例子中提到的毕老师化妆成毕姥爷,此时的‘毕老师’只有毕姥爷的功能,不能使用毕老师的看电影功能,因为毕姥爷没有这个功能。
回复 使用道具 举报
我的理解: 父类的类 = 设计图纸A   子类的类 = 设计图纸B    子类图纸包括父类图纸, 就是说 图纸B 比 图纸A 长
父类引用指向子类对象,  带着A图纸 去跟 B 图纸重叠, 因为是 父类引用,,, 所以视野只能在父类图纸范围内移动, 所以就访问不到多出来的图纸B的部分咯(子类特有的方法.)
-0 - 能看得懂最好, 看不懂就无视.
回复 使用道具 举报
对象是子类的,类型不是子类的,当然不能访问子类特有的内容了。想要访问子类的特有的内容时可以先强转为子类的类型。你说的正是多态的特性
回复 使用道具 举报
这怎么说呢。。。多态就是这样啊。。。
如果父类类型建了子类的对象,也和子类类型建的一模一样,那才不可思议呢。。
回复 使用道具 举报
左边是声明,右边是实体,动物 s=new 猫( );就像告诉编译器s对象是个动物,虽然你传个猫进来 但是他只s当动物看
回复 使用道具 举报
PinkDay 初级黑马 2014-10-19 00:38:24
7#
对啊  ,要向下转型的  转成子类  然后就可以访问子类特有的元素了~
回复 使用道具 举报
在编译时期JVM只知道这是一个父类引用,并不会关心引用的右边是不是子类对象,所以编译时发现父类引用去调用子类特有的成员时会出错。拿动物作比较,相当于编译时JVM只知道你会创建一个动物,并不知道你创建的是猫呢还是狗呢,而你却用动物去调用猫的抓老鼠的方法,虽然可能你动物的引用是指向了猫,但是编译时编译器并不知道你创建的那个动物就是猫。
回复 使用道具 举报
Eagle 高级黑马 2014-10-19 08:58:19
9#
我们能转换的是父类应用指向了自己的子类对象时,该应用可以被提升,也可以被强制转换。
        多态至始至终都是子类对象在做着变化

可以强制的将父类的引用,转成子类类型。”向下转型“:Cat c = (Cat)a;
回复 使用道具 举报
不要想那么多,你只要知道,不管你右边是用什么创建的,但是你的目的是创建左边的对象,所以最后剩下的就是左边的类型对象,那么也只能有它自己的功能。就像你定义byte b = 4,很明显右边的4是int型的,但是b有那么大空间吗?
回复 使用道具 举报
没看到这里,这难吗》
回复 使用道具 举报
wf111sxwf 来自手机 中级黑马 2014-10-20 20:04:52
12#
多态简单说就是向上转型,动物会叫猫也会叫 猫是动物,但是动物却不一定都会抓老鼠吧。所以多态中不能调用子类特有方法。
回复 使用道具 举报
wf111sxwf 来自手机 中级黑马 2014-10-20 20:06:08
13#
补充一下,想要调用特有方法可以向下转型
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马