面向对象基础-多态02(引用类型的类型转换)
作者:互联网
引用类型的类型转换
基本数据类型之间是可以发生数据类型转换的,引用数据类型也是可以的
但是引用数据类型发生转换的条件比较苛刻,出错后的问题也更严重
引用数据类型要发生类型转换
- 前提:具有父子关系的两个类型之间
- 没有父子关系的两个类型之间不能发生类型转换,通过不了编译
自动类型转换
-
子类的引用转换成父类的引用,在继承链中属于向上,编译器默认允许
-
称之为自动类型转换或者向上转型
-
语法
-
父类 引用名 = 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 ;
标签:02,类型转换,子类,多态,孔子,转型,引用,父类 来源: https://blog.csdn.net/gy99csdn/article/details/112424980