BB为子类继承父类AA
情况一:
AA aa=new BB();//向上转型
BB bb=(BB)aa;//强制进行向下转型,把对象aa强制转换成对象bb
情况二:
BB bb=(BB)new AA ();//直接向下转型,调用方法报错
java中的向上转型和向下转型问题。为什么一步到位的向下转型会报错,而分两步的向下转型却没错
答案:4 悬赏:60
解决时间 2021-12-15 20:44
- 提问者网友:野性
- 2021-12-15 01:46
最佳答案
- 二级知识专家网友:为你轻狂半世殇
- 2021-12-15 03:12
情况1: aa保存的是一个BB类型的实例,在编译过程中引用为AA类型,数据存储过程中含有全部BB类的方法和变量;bb只是把aa从AA类型的引用重新定义为BB类型的引用,由于aa中包含BB类的全部方法和变量,所以转型没有问题
情况2: new AA() 中可能不包含BB类的全部变量和方法,强制转换无法实现
思考方法:JAVA中的变量名看成数据指针,new 是在内存中实际的创造一个实例。当创造了一个子类的实例时,指针类型是父类或子类都没有关系。但父类的实例不可能用子类的指针来表达。
情况2: new AA() 中可能不包含BB类的全部变量和方法,强制转换无法实现
思考方法:JAVA中的变量名看成数据指针,new 是在内存中实际的创造一个实例。当创造了一个子类的实例时,指针类型是父类或子类都没有关系。但父类的实例不可能用子类的指针来表达。
全部回答
- 1楼网友:摧毁过往
- 2021-12-15 04:47
哪个说的
如果你需要使用多态,那么就应该向上转型,至于为什么使用多态,什么时候使用,只有自己慢慢琢磨,也不用刻意去琢磨,时间久了,代码量多了,自己慢慢就会有感觉了
向下转型是不安全的,当然,如果你已经确定他是这个子类了,就可以向下转,如果你使用了多态,而又用到了向下转型,那么你可以考虑下你的设计是否有问题了
继承少用,多用实现(不能滥用)
如果你用了向下转型,那么当初是为了什么而向上转型呢?考虑下这个问题。
像反序化就要向下转型为自己的子类,因为反序列化得到的是一个object
从集合取出元素也要向下转型,你可能说不用呀,那是java帮你做了,泛型都是使用object的擦除来实现的。
- 2楼网友:而你却相形见绌
- 2021-12-15 04:13
因为前一个实际指向一个BB的实例。后者不是。
instanceof 返回 true的才能强制转型。
- 3楼网友:许你一世温柔
- 2021-12-15 03:32
强制转型这个叫法来自过去非面向对象的时候吧,对于面向对象来说,只有基本类型 int/float/long/double 之类的数据类型还可以像以前一个叫强制转型,因为它确实是转了型,你想一个 int 在内存里面的二进制布局和 float/double 的 IEEE 浮点格式的二进制布局肯定不同啊。所以需要转型的,这个转型在 int/long 与 float/double 之间转型时会导致永久性的物理性的变化。
而面向对象据说的向下强制转型则不同于基本类型的转型,面向对象的抽象类型的转型本身并不能改变对象的类型,仅仅是把之前由于向上转换而产生的暂时性的隐藏了子类的方法和属性的效果还原成原来的样子。比如 Parent p = new Child() 这将导致 Child 的某些属性和方法在 Parent 中没有而暂时隐藏了,因为你还是可以通过 Java 反射调用的,只是编译器会检测如果你直接调用了 child 的方法(不是通过反射)就会出错,这就是实质上那个 p 还是 Child 类型,只是能不能把它当成 child 来使用。编译器来做这个检查。你明白的是那个对象本身并没有任何变化。
你也可以通过 new String("一个字符串不可能是 Double 的子类") instanceof java.lang.Double 来判断,编译器能立即检测到一个字符串不可能是 Double 的子类而报错。
我要举报
如以上问答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯