前置条件
有父类Animal,Cat是Animal的子类之一,即:
// 父类:动物
public class Animal {...}
// 子类:猫咪
public class Cat extends Animal {...}
1.向上转型 - 子类转换成父类
// 向上转型:子类转成父类
Animal animal = new Cat();
向上转型一定安全,不会抛出异常,但也存在弊端:
向上转型后,无法再调用子类特有的方法
解决方案:对象的向下转型(强制类型转换),将已向上转型的父类对象还原成子类对象。
2.向下转型 - 父类转换成子类
// 向下转型(强制类型转换):父类转成子类
Cat cat = (Cat)animal;
如果这个父类在向上转型之前与子类类型不匹配(即Dog -> Animal -> Cat),就会抛出异常。
为解决这个问题,可以用instanceof来判断该父类原本的子类类型
3.instanceof
// 判断父类对象animal原本的类型是否为Cat
animal instanceof Cat; //true
据此,可以利用instanceof关键字来实现定向的向下转型:
if (animal instanceof Cat){
Cat cat = (Cat)animal;
return cat;
}
else if(animal instanceof Dog){
Dog dog = (Dog)animal;
return dog;
}