引用类型转换
1、向上类型转换(自动/隐式类型转换),是小类型转化成大类型,不存在认了风险。即子类型对象也是父类型。
2、向下类型转化(强制类型转化),大类型转化成小类型,存在一定风向。多态实例后,都可以向上类型转化,但是转化后,子类型对象间的互相转换就会存在一定风险。
如何规避风险?
使用instanceof运算符,来解决引用对象的类型,避免类型转换的安全性问题
Dog dog = new Dog();
// 向上类型转换(类型自动提升),不存在风险
Animal animal = dog;
//风险演示 animal指向Dog类型对象,没有办法转化成Cat对象,编辑阶段不会报错,但是运行会报错
Cat cat = (Cat)animal;// 1.编译时 按Cat类型 2. 运行Dog类型 类型不匹配。直接报错
规避风险,提高程序安全性
//创建子类对象
Dog dog = new Dog();
// 向上类型转换(类型自动提升),不存在风险
Animal animal = dog;
// 向下类型转换(存在一定风险) 我们可以强制转换
if(animal instanceof Dog)
{
Dog dog2 = (Dog)animal;
System.out.println("转化类型成功");
}else
{
System.out.println("向下类型转化失败"+animal.getClass());
}
//规避风险 (instanceof运算符)
if(animal instanceof Cat)
{
Cat cat = (Cat)animal;
System.out.println("转化类型成功");
}else
{
System.out.println("转化类型失败"+animal.getClass());
// 后面学习直接用到 throw new classCastException();
}
总结 :
1> instanceof 的作用是 测试它左边的对修 是否 是它右边的类的实例。
2> 在编写Java程序时,引用变量只能调用它编译时类型的方法,而不能调用它运行时类型的方法,即使他实际所引用的对象确实包含该方法。如果需要让这个引用变量来调用它运行时类型的方法,必须使用强制类型转换把他转换成运行时类型。然而,在强制转换的过程中,是有可能出现类型强制转换异常(ClassCastException),规避他的方法也很简单,利用instanceof关键字来判断是否是本类对象,如果成立的化,再进行强制类型转换。
instanceof 相当于oc语言中的 isMemberOfClass