8.0、Java继承与多态 - instanceof关键字
在 Java 中对象可以向上转型和向下转型;
向上转型 是绝对安全的,用代码来实现其实就是 ->
父类名 对象名 = new 子类名();就是我们多态的写法;向上转型是绝对安全的,例如 一个抽象类 - 动物类_Animal ,一个子类 - 猫类_Cat extends Animal,向上转型 Animal animal = new Cat();这样是没有任何问题的 [ 其实很好理解,因为猫也可以说成是动物嘛,所以向上转型是绝对安全的;],只是 animal 不能调用 Cat 类中独有的方法;
然而 向下转型 通俗的来说就是 强制类型转换,用代码来实现就是 ->
Animal animal = new Cat(); // 创建一个 animal 对象
Cat cat = (Cat) animal; //将 animal 对象强制转换为 Cat 类对象
向下转型不是绝对安全的,如上所述的代码,我们先是将猫向上转型为动物 [ Animal animal = new Cat();] ,然后将 animal动物 再强制转换回来还原成 猫Cat [ Cat cat = (Cat) animal; ] 这里注意我的用词是 " 还原 ",也就是说原来是什么就只能强制还原成什么;
假设我们 动物类_Animal 有两个子类分别是 猫_Cat 和 狗_Dog,如果我们一开始是由 猫 向上转型成为 动物 的,那么向下转型还原的时候就只能将 动物 还原成 猫,而不能还原成 狗;如下代码所示就是错的 ->
Animal animal = new Cat(); Dog dog = (Dog) animal; //在运行时会报错 - ClassCastException Cat cat = (Cat) animal; //正确写法
instanceof 关键字:
为了避免出现 ClassCastException 异常,我们在向下转型的时候就得先判断一下该对象原来是否为我们想要还原的类,那怎么判断呢?引出我们的关键字 - instanceof ;
使用方法,如下所示 ->
对象名 instanceof 类名
该表达式会返回一个 boolean 类型的值,结果为 true 的话原来该对象就是该类型,返回为 false 的话就不是;
在实际开发中,instanceof 关键字常用在判断形参中的对象原来是什么类型,如下所示 ->
public void pet(Animal animal) {
if(animal instanceof Cat) {
Cat cat = (Cat) animal;
cat.catMethod();
}
if(animal instanceof Dog) {
Dog dog = (Dog) animal;
dog.dogMethod();
}
}