面向对象基础-多态02(引用类型的类型转换)

博客主要介绍Java中引用类型的类型转换。引用数据类型转换需有父子关系,包括自动类型转换(子类转父类,安全)和强制类型转换(父类转子类,不安全)。强制转换失败会抛出ClassCastException,推荐用instanceof校验。还通过例子形象说明转型过程。

引用类型的类型转换

基本数据类型之间是可以发生数据类型转换的,引用数据类型也是可以的

但是引用数据类型发生转换的条件比较苛刻,出错后的问题也更严重

引用数据类型要发生类型转换

  • 前提:具有父子关系的两个类型之间
  • 没有父子关系的两个类型之间不能发生类型转换,通过不了编译

自动类型转换

  • 子类的引用转换成父类的引用,在继承链中属于向上,编译器默认允许

    • 称之为自动类型转换或者向上转型

    • 语法

    • 父类 引用名 = new 子类();
      
    • 子类一定可以看成父类,所以能够自动转型

    • 向上转型是安全,可以放心使用

强制类型转换

  • 父类的引用转换成子类的引用,在继承链中属于向下,编译器默认不允许,需要显式强行转换

    • 称之为强制类型转换或者向下转型

    • 语法

    • 子类 引用名 = (子类)父类引用;
      
    • 子类继承和扩展了父类,父类大多数情况下都不能看成子类,所以需要强制类型转换

    • 重要前提:强制类型转换若想成功,必须是该父类引用指向的对象本身就是一个要强转的子类对象

  • 强制类型转换是不安全的,要想转型成功,必须真实的对象和要转型的类型一致

    • 父类引用指向的不一定就是那个你要强转的子类的对象
    • 比如动物类的引用指向了一个猫对象,现在把引用强转成一个狗引用,能成功吗?
  • 为了保障安全,向下转型推荐使用instanceof关键字校验

    • 语法

    • 引用名 instanceof 类名
      
    • 这个表达式返回一个布尔类型的值

      • true代表该引用指向的对象,是一个后面类名的对象
      • null instanceof 任何类 结果都是false

ClassCastException

强制类型转换一旦失败,就会抛出ClassCastException,程序报错终止

  • 没有人会故意给自己找麻烦
  • 不到万不得已,不要使用强制类型转换

举一个形象的例子

​ 孔子(Confucius)装爹

孔子他爹可以教JavaSE,他爹48岁

孔子会教《论语》,孔子28岁,孔子还会打游戏

Java培训很火,有很多人请孔子爹去上课,有一天孔子爹被人请走了

但是又来了一个人来请孔子爹去讲课,给的钱很多

于是孔子就穿上他爹的衣服,沾上胡子,戴上眼镜,就开始装爹

向上转型

ConfuciusFather cf = new Confucius();

这个时候,别人问孔子,您多大岁数了啊?

孔子不敢说实话,只好说我今年48岁

cf.age = 48;

到了地方,开始上课

cf.teach();

这时候就露馅了,因为孔子不会教JavaSE,于是孔子就开始教授论语,毕竟半步论语治天下

程序员学点论语没毛病

到了下课时间,孔子很想打游戏,但是想着自己现在的身份是老爹,老爹从来不打游戏

于是孔子也不敢打游戏

// cf.playGame(); 无法调用

终于,把时间熬完了,终于下班了

孔子赶紧跑回家

脱下爹的衣服,摘下眼镜,拔掉胡子

向下转型

Confucius c = (Confucius)cf;

这个时候”变年轻“的孔子打开手机,玩了一把王者荣耀

c.age = 28;

c.playGame ;

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值