向上转型
向上转型:将导出类的引用转换为基类引用的动作
导出类即子类或实现类,基类也就是父类或接口。
eg:Animal 的子类 Cat,如下:
class Animal {
void eat() {
// ...
}
}
class Cat extends Animal {
void eat() {
// ...
}
void eatMore() {
// ...
}
}
public static void feed(Animal animal) {
animal.eat();
}
public static void main(String args[]) {
Cat cat = new Cat();
feed(cat);
}
feed 方法可以接受Animal的引用,但是我们传递的是Cat的引用。Cat的引用被转换为Animal的引用,这个动作就是向上转型。
向下转型与运行时类型识别(RTTI)
向下转型,示例如下:
public static void main(String args[]) {
Animal a1 = new Cat();
Animal a2 = new Animal();
// 如果调用eatMore()方法,就必须向下转型
((Cat)a1).eatMore();
((Cat)a2).eatMore(); // ClassCastException
}
调用eatMore()方法,就必须向下转型,使用小括号进行强制类型转换即可,这样代码在编译时就不会有问题。但是,在执行eatMore()方法时,会对a1、a2的类型进行检查,称为运行时类型识别(RTTI)。运行时,尝试将a1、a2转换为Cat,如果本来不是Cat类型,就会转换失败,返回一个ClassCastException。