一、向上转型
向上转型实际就是创建一个子类对象,将其当成父类对象来使用
1、向上转型的三种方式:
(1)直接赋值:
(2)方法的传参:
(3)返回值:
2、向上转型优缺点:
优点:让代码实现更加简单灵活
缺点:不能调用到子类特有的方法
二、向下转型
将一个子类对象经过向上转型之后当成父类方法使用,便无法再调用子类特有的方法,但有时又可能需要调用子类特有的方法,此时,将父类引用再还原为子类对象即可,如下:
类似于将 animal 对象强制类型转换为Dog类型,然后就可以调用Dog子类中特有的 bark 方法了
但是并不是所有的向下转型都可以成功,如下:
程序可以通过编译,但运行时抛出异常,因为animal实际指向的是猫,现在要强制还原为狗,无法正常还原,运行时抛出:ClassCastException(类型转换异常)
向下转型用的比较少,而且不安全,万一转换失败,运行时就会抛出异常,Java中为了提高向下转型的安全性,引入了 instanceof,如果该表达式为 true,则可以安全转换,如下:
结果:
所用代码:
public class Animal {
String name;
private int age;
public void eat(){
System.out.println(name + "正在吃饭!");
}
}
public class Dog extends Animal{
public void eat(){
System.out.println(name + "正在吃骨头!");
}
public void bark(){
System.out.println(name + "正在汪汪叫!");
}
}
public class Cat extends Animal{
public void eat(){
System.out.println(name + "正在吃鱼!");
}
}
public class Test{
public static void main(String[] args) {
Animal animal = new Cat();
if(animal instanceof Dog){
Dog dog = (Dog) animal;
dog.bark();
}else{
System.out.println("向下转型失败!");
}
}
}