Java多态对象的类型转换

本文深入探讨了Java中对象类型转换的原理,包括向上转型和向下转型的过程与风险,以及如何使用instanceof运算符安全地进行类型转换。通过具体代码示例,详细解释了在多态性和动态绑定下,子类对象如何在父类引用中被正确调用。

这里所说的对象类型转换,是指存在继承关系的对象,不是任意类型的对象。当对不存在继承关系的对象进行强制类型转换时,java 运行时将抛出 java.lang.ClassCastException 异常。

在继承链中,我们将子类向父类转换称为“向上转型”,将父类向子类转换称为“向下转型”。

很多时候,我们会将变量定义为父类的类型,却引用子类的对象,这个过程就是向上转型。程序运行时通过动态绑定来实现对子类方法的调用,也就是多态性。

然而有些时候为了完成某些父类没有的功能,我们需要将向上转型后的子类对象再转成子类,调用子类的方法,这就是向下转型。

注意:不能直接将父类的对象强制转换为子类类型,只能将向上转型后的子类对象再次转换为子类类型。也就是说,子类对象必须向上转型后,才能再向下转型。请看下面的代码:

  1. public class Demo {
  2. public static void main(String args[]) {
  3. SuperClass superObj = new SuperClass();
  4. SonClass sonObj = new SonClass();
  5.  
  6. // 下面的代码运行时会抛出异常,不能将父类对象直接转换为子类类型
  7. // SonClass sonObj2 = (SonClass)superObj;
  8.  
  9. // 先向上转型,再向下转型
  10. superObj = sonObj;
  11. SonClass sonObj1 = (SonClass)superObj;
  12. }
  13. }
  14.  
  15. class SuperClass{ }
  16. class SonClass extends SuperClass{ }

将第7行的注释去掉,运行时会抛出异常,但是编译可以通过。

因为向下转型存在风险,所以在接收到父类的一个引用时,请务必使用 instanceof 运算符来判断该对象是否是你所要的子类,请看下面的代码:

  1. public class Demo {
  2. public static void main(String args[]) {
  3. SuperClass superObj = new SuperClass();
  4. SonClass sonObj = new SonClass();
  5.  
  6. // superObj 不是 SonClass 类的实例
  7. if(superObj instanceof SonClass){
  8. SonClass sonObj1 = (SonClass)superObj;
  9. }else{
  10. System.out.println(“①不能转换”);
  11. }
  12.  
  13. superObj = sonObj;
  14. // superObj 是 SonClass 类的实例
  15. if(superObj instanceof SonClass){
  16. SonClass sonObj2 = (SonClass)superObj;
  17. }else{
  18. System.out.println(“②不能转换”);
  19. }
  20. }
  21. }
  22.  
  23. class SuperClass{ }
  24. class SonClass extends SuperClass{ }

运行结果:
①不能转换

总结:对象的类型转换在程序运行时检查,向上转型会自动进行,向下转型的对象必须是当前引用类型的子类。

推荐学习目录

1. 继承的概念与实现
2. Java super关键字
3. 继承中的方法的覆盖和重载
4. 多态和动态绑定
5. instanceof 运算符
6. 多态对象的类型转换
7. Java static关键字
8. Java final关键字

9. Java Object类

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值