一、向下转型
与向上转型对应的是向下转型:向上转型详见博客
1、作用:
将一个子类的对象经过向上转型后当成父类的方法使用,则无法调用子类的方法,为了解决这个问题,需要将父类引用再还原成子类即可,就称为向下转型。
2、编译实现
现在定义一个Animal类,再写一个Bird类继承Animal类,Bird类中有fly( )方法,我们现在想调用这个方法,就需要向下转型
定义一个Animal类,再写一个Bird类继承Animal类:
class Animal{
public void eat(){
System.out.println("吃食物");
}
}
class Bird extends Animal{
public void fly(){
System.out.println("飞飞飞!!!!!");
}
}
向下转型:
public class TestDemo {
public static void main(String[] args) {
Animal animal = new Bird(); //向上转型
Bird bird = (Bird) animal; //向下转型
bird.fly();
}
二、instanceof
1、问题:
向下转型有一个最大的特点是不安全,比如我们将一个Cat类向下转型为Bird类,继承了fly( )方法,但显然猫并不会飞,会转换失败
代码演示:
public class TestDemo {
public static void main(String[] args) {
Animal animal = new Cat(); //向上转型
Bird bird = (Bird) animal; //向下转型
bird.fly();
}
}
2、作用
我们可以利用instanof来判断这个animal是否为Bird类,来提高安全性
代码演示:
public class TestDemo {
public static void main(String[] args) {
Animal animal = new Cat(); //向上转型
if(animal instanceof Bird){ //编译器判断
Bird bird = (Bird) animal; //向下转型
bird.fly();
}
}
}
因为编译器判断此时的animal是父类引用的Cat类,所以并不会进行转换,因此也不会调用fly( )方法