原则
- 编译看左边,运行看右边。 父类型引用指向子类型对象,无法调用只在子类型里定义的方法
- 向上转型一定是安全的。但是也有个弊端,一旦对象向上转型为父类,那么就无法调用子类原本特有的内容(解决方案:向下转型)
代码
package com.prometheus.test;
class Cat extends Animal {
@Override
public void eat() {
System.out.println("猫在吃鱼");
}
public void run() {
System.out.println("猫在跑");
}
}
public class Animal {
public void eat() {
System.out.println("动物吃东西");
}
public static void main(String[] args) {
Animal animal = new Cat(); // 本来是猫,向上转型,当做动物
animal.eat(); // 猫吃鱼
// animal.run();// 报错,报错,编译报错
// 如果希望使用子类特有的方法,需要向下转型
if (animal instanceof Cat) { // true
Cat cat = (Cat) animal;
cat.run(); // 猫在跑
}
}
}