例子
子类转换成父类时的规则:
public class TestAnimalDemo {
public static void main(String[] args) {
show(new Cat()); // 以 Cat 对象调用 show 方法
show(new Dog()); // 以 Dog 对象调用 show 方法
Animal a = new Cat(); // 向上转型
a.eat(); // 调用的是 Cat 的 eat
Cat c = (Cat) a; // 向下转型
c.work(); // 调用的是 Cat 的 work
}
public static void show(Animal a) {
a.eat();
// 类型判断
if (a instanceof Cat) { // 猫做的事情
Cat c = (Cat) a;
c.work();
} else if (a instanceof Dog) { // 狗做的事情
Dog c = (Dog) a;
c.work();
}
}
}
abstract class Animal {
abstract void eat();
}
class Cat extends Animal {
public void eat() {
System.out.println("吃鱼");
}
public void work() {
System.out.println("抓老鼠");
}
}
class Dog extends Animal {
public void eat() {
System.out.println("吃骨头");
}
public void work() {
System.out.println("看家");
}
}
- 输出结果
吃鱼
抓老鼠
吃骨头
看家
吃鱼
抓老鼠
-
多态的实现条件
多态的三个条件:
-
继承的存在(继承是多态的基础,没有继承就没有多态);
-
子类重写父类的方法(多态下调用子类重写的方法);
-
父类引用变量指向子类对象(子类到父类的类型转换)。
-
将一个父类的引用指向一个子类的对象,称为向上转型(
upcasting
),自动进行类型转换。此时通过父类引用调用的方法是子类覆盖或继承父类的方法,不是父类的方法。 此时通过父类引用变量无法调用子类特有的方法; -
如果父类要调用子类的特有方法就得将一个指向子类对象的父类引用赋给一个子类的引用,称为向下转型,此时必须进行强制类型转换。
-
可以用
instanceof
判断一个类是否实现了某个接口,也可以用它来判断一个实例对象是否属于一个类。instanceof
的语法格式为: 对象 instanceof 类(或接口)
-
它的返回值是布尔型的,或真(
true
)、或假(false
)。
#####多态的实现形式
在Java中有两种形式可以实现多态:继承和接口。