黑马程序员技术交流社区

标题: 多态的问题 [打印本页]

作者: 逍遥小seng    时间: 2014-10-17 18:20
标题: 多态的问题
为什么用父类引用建了子类的对象,却不能访问子类中特有的内容,不都是建立的子类对象吗,子类对象不是能访问子类的所有内容吗?理解不了,谁帮解释下!
作者: Mr.Ni    时间: 2014-10-17 20:12
父类中没有定义的不能调用,因为此时是父类引用,你要调用,只能先向下转型,就是先转换成子类类型,才能调用子类中特有的。
视频中有讲过毕老师和毕老师的父亲的例子,当多态时,也就是父类引用指向子类对象的时候,就是例子中提到的毕老师化妆成毕姥爷,此时的‘毕老师’只有毕姥爷的功能,不能使用毕老师的看电影功能,因为毕姥爷没有这个功能。
作者: 朴日男    时间: 2014-10-17 20:42
我的理解: 父类的类 = 设计图纸A   子类的类 = 设计图纸B    子类图纸包括父类图纸, 就是说 图纸B 比 图纸A 长
父类引用指向子类对象,  带着A图纸 去跟 B 图纸重叠, 因为是 父类引用,,, 所以视野只能在父类图纸范围内移动, 所以就访问不到多出来的图纸B的部分咯(子类特有的方法.)
-0 - 能看得懂最好, 看不懂就无视.
作者: 家进    时间: 2014-10-18 14:11
对象是子类的,类型不是子类的,当然不能访问子类特有的内容了。想要访问子类的特有的内容时可以先强转为子类的类型。你说的正是多态的特性
作者: 面具猴    时间: 2014-10-18 14:17
这怎么说呢。。。多态就是这样啊。。。
如果父类类型建了子类的对象,也和子类类型建的一模一样,那才不可思议呢。。
作者: Nullifier    时间: 2014-10-18 23:38
左边是声明,右边是实体,动物 s=new 猫( );就像告诉编译器s对象是个动物,虽然你传个猫进来 但是他只s当动物看
作者: PinkDay    时间: 2014-10-19 00:38
对啊  ,要向下转型的  转成子类  然后就可以访问子类特有的元素了~
作者: 戏言丶    时间: 2014-10-19 01:57
在编译时期JVM只知道这是一个父类引用,并不会关心引用的右边是不是子类对象,所以编译时发现父类引用去调用子类特有的成员时会出错。拿动物作比较,相当于编译时JVM只知道你会创建一个动物,并不知道你创建的是猫呢还是狗呢,而你却用动物去调用猫的抓老鼠的方法,虽然可能你动物的引用是指向了猫,但是编译时编译器并不知道你创建的那个动物就是猫。
作者: Eagle    时间: 2014-10-19 08:58
我们能转换的是父类应用指向了自己的子类对象时,该应用可以被提升,也可以被强制转换。
        多态至始至终都是子类对象在做着变化

可以强制的将父类的引用,转成子类类型。”向下转型“:Cat c = (Cat)a;
作者: mingtianrsm    时间: 2014-10-19 09:26
不要想那么多,你只要知道,不管你右边是用什么创建的,但是你的目的是创建左边的对象,所以最后剩下的就是左边的类型对象,那么也只能有它自己的功能。就像你定义byte b = 4,很明显右边的4是int型的,但是b有那么大空间吗?
作者: 郭.威    时间: 2014-10-20 03:05
没看到这里,这难吗》
作者: wf111sxwf    时间: 2014-10-20 20:04
多态简单说就是向上转型,动物会叫猫也会叫 猫是动物,但是动物却不一定都会抓老鼠吧。所以多态中不能调用子类特有方法。
作者: wf111sxwf    时间: 2014-10-20 20:06
补充一下,想要调用特有方法可以向下转型




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