Java 多态中的类型转换(instanceof)

引用类型转换
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

demo 传送门

你可能感兴趣的:(Java,成长之路,java,多态,类型转化)