向上转型一定是安全的,没有问题的,但是也有一个弊端,对象一旦向上转型为父类,那么就无法调用子类原本特有的内容。
解决方案:用对象的向下转型【还原】。
例如:
package 多态;
public class democ01 {
public static void main(String[] args) {
// 对象的向上转型,就是:父类引用指向子类对象。
Animal animal = new Cat();
animal.eat();
// animal.catchMouse(); // 错误写法!
// 向下转型,进行“还原”动作
Cat cat =(Cat) animal;
cat.catchMouse();
// 下面是错误的向下转型
// 本来new的时候是一只猫,现在非要当作狗
// java.Lang.ClassCastException 类转换异常
// Dog dog =(Dog) animal; // 错误写法!编译不会报错,运行会异常。
}
}
package 多态;
public abstract class Animal {
public abstract void eat();
}
package 多态;
public class Cat extends Animal {
@Override
public void eat() {
System.out.println("猫吃鱼");
}
//子类特有方法
public void catchMouse(){
System.out.println("猫抓老鼠");
}
}
package 多态;
public class Dog extends Animal {
@Override
public void eat() {
System.out.println("狗吃屎");
}
public void watchHouse(){
System.out.println("狗看家");
}
}
运行结果: