黑马程序员技术交流社区

标题: 一个关于多态中向上转型和向下转型的问题 [打印本页]

作者: Huangzikun    时间: 2016-4-18 00:10
标题: 一个关于多态中向上转型和向下转型的问题
今天看到黑马JAVA基础教学视频中的多态课程,视频中老师把多态中的向上向下转型与基本数据类型的强转作类似对比,但我对此产生了疑问,就是基本数据类型的强转会有精度丢失的问题,那多态的向下转型会否有类似问题呢?若不会,原因又是什么呢?求大神解答

作者: 东方乔恩    时间: 2016-4-18 00:10
基本数据类型的转型丢失精度是因为各种类型在内存中开辟的空间大小不同造成的,而多态的所谓转型只不过是比喻,各个引用存储的还都是地址值,所以不会丢失精度
作者: 追梦赤子    时间: 2016-4-18 02:37
不会,因为多态向下转型,他用的是属于自己特有的
作者: guozhicheng    时间: 2016-4-18 23:19
这个我还真回答不了.支持你!!!
作者: liudh1    时间: 2016-4-18 23:26
基本数据类型:向下转型会损失精度,向上不会;多态中父类引用指向子类对象,是对子类进行提升;向下转型必须是instanceof返回true是才能向下转型!不然会出现类型转换异常.
作者: 1165046886    时间: 2016-4-18 23:36
前段时间学了多态,在这里试着回答一下.

向下转型不会存在精度丢失问题,原因就在于向下转型的目的是为了使用子类特有的方法,并不涉及具体参数.视频中老师以强转为例解释向上转型及向下转型,是为了便于我们理解,其实两块内容并没有互通的地方.

多态的前提是父类引用指向子类对象,这就是向上转型了.可是向上转型后,就出现了一个问题,子类特有的方法无法再调用.为了解决这个问题,就需要用到向下转型,将原来通过向上转型实现多态的对象再转回来,从而达到调用子类特有方法的目的.整个过程并没有与任何数据打交道,所以也就不存在精度丢失的问题了.

所以,在看视频的时候,不能简单的将老师说的一句话单独分割出来理解,要学会前后知识点的融会贯通,这样才不会进入误区.

希望我的答案能帮到你.
作者: wufengqiao    时间: 2016-4-19 00:20
不会的,多态向下转是为了使用子类的特有方法,转型过程中其引用类型的值会发生改变
作者: xiaoxiqq    时间: 2016-4-19 02:27
不会。它会在运行时自动查找包含的子类。若没查找到。就会报错。这个就是多态的一种体现方式。
作者: AAAheilong    时间: 2016-4-19 08:22
不会,他们只是类似,原理并不一样。
作者: wan1137856139    时间: 2016-4-19 09:14
向多态向下转型是使用子类的特有属性,不存在损失精度的问题
作者: hmcxypzq    时间: 2016-4-20 00:34
首先,你的明确为什么需要向上转型和向下转型:
给你举个简单的例子,一只猫在吃鱼,我们是不是也可以说成一只动物在吃鱼,这个时候其实,就是一种向上转型,这个时候引用对象就成了动物(父类),而猫具体的行为和外貌就是这只动物的成员属性,: 动物类 dongwu=new 猫类();
这就是向上转型,他是系统自发进行的. 然后可以通过对象 dongwu来访问new后面的属性.

而向下转型必须在向上转型的前提下才能够进行,也就是先有向上转型,才能够有向下转型.:比如,把猫看成动物之后,我是不是也可以把动物在还原回来看成猫,但不能够说,这只动物可以看成是狗.
刚才我们把猫看成了一只动物,通过动物来访问这只猫具有的属性.但如果我们现在不想要把这动物说成动物了,而是想要把它还原成猫来看待,这个时候就需要用到向下转型了.
猫类 mao=(猫类)dongwu;
dongwu是对象,这样就相当于还原成最开始的状态了,通过猫类对象访问该对象中的属性.

记住一个很重要的一点:使用多态的前提必须是要有,继承关系的存在,就如上面的例子来说,动物类就是猫的父类,而狗类和猫类是不具有任何关系的.你不能够把一只狗看成一只猫,或者把一只猫看成一只狗吧???

深更半夜,纯手打,望理解,望采纳,望给黑马币.
作者: hmcxypzq    时间: 2016-4-20 00:36
首先,你的明确为什么需要向上转型和向下转型:
给你举个简单的例子,一只猫在吃鱼,我们是不是也可以说成一只动物在吃鱼,这个时候其实,就是一种向上转型,这个时候引用对象就成了动物(父类),而猫具体的行为和外貌就是这只动物的成员属性,: 动物类 dongwu=new 猫类();
这就是向上转型,他是系统自发进行的. 然后可以通过对象 dongwu来访问new后面的属性.

而向下转型必须在向上转型的前提下才能够进行,也就是先有向上转型,才能够有向下转型.:比如,把猫看成动物之后,我是不是也可以把动物在还原回来看成猫,但不能够说,这只动物可以看成是狗.
刚才我们把猫看成了一只动物,通过动物来访问这只猫具有的属性.但如果我们现在不想要把这动物说成动物了,而是想要把它还原成猫来看待,这个时候就需要用到向下转型了.
猫类 mao=(猫类)dongwu;
dongwu是对象,这样就相当于还原成最开始的状态了,通过猫类对象访问该对象中的属性.

记住一个很重要的一点:使用多态的前提必须是要有,继承关系的存在,就如上面的例子来说,动物类就是猫的父类,而狗类和猫类是不具有任何关系的.你不能够把一只狗看成一只猫,或者把一只猫看成一只狗吧???

深更半夜,纯手打,望理解,望采纳,望给黑马币.
作者: Huangzikun    时间: 2016-4-20 01:08
hmcxypzq 发表于 2016-4-20 00:34
首先,你的明确为什么需要向上转型和向下转型:
给你举个简单的例子,一只猫在吃鱼,我们是不是也可以说成一只 ...

你好像把视频中老师说的话给重复打出来了,没有回答到点上
作者: 进击的鬼笔环肽    时间: 2016-4-20 23:38
转型的时候成员变量类型都不会改变,何来精度改变一说
作者: Huangzikun    时间: 2016-4-21 18:43
东方乔恩 发表于 2016-4-18 00:10
基本数据类型的转型丢失精度是因为各种类型在内存中开辟的空间大小不同造成的,而多态的所谓转型只不过是比 ...

好像就是这么回事




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