【Java专题】类的多态

多态(polymorphism)是面向对象编程中的一个重要概念,它指的是同一个方法调用在不同的对象上可能会有不同的行为。多态可以通过继承和接口来实现,使得代码更加灵活和可扩展。

要点

  • 多态是方法的多态,不是属性的多态
  • 多态的实现需要满足以下条件:
    • 继承:子类继承父类或者实现接口
    • 重写:子类重写父类的方法或者实现接口的方法
    • 父类引用指向子类对象:父类类型的变量可以引用子类类型的对象
  • 父类引用指向子类对象后,可以通过父类引用调用子类重写的方法,这时会执行子类的方法实现,而不是父类的方法实现,这就是多态的表现

代码示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
package study.ghr.pk1;

class Animal {
public void shout() {
System.out.println("哇哇哇");
}
}

class Dog extends Animal {
public void shout() {
System.out.println("汪汪汪");
}
public void seeDoor() {
System.out.println("看门");
}
}

class Cat extends Animal {
@Override
public void shout() {
System.out.println("喵喵喵");
}
public void catchMouse() {
System.out.println("抓老鼠");
}
}

public class TestPolymorphism {
public static void main(String[] args) {
Animal a1 = new Dog(); // 父类对象指向子类引用,向上转型,自动转型
a1.shout(); // 汪汪汪 运行时根据对象的实际类型调用方法
//a1.seeDoor(); // 编译错误,Animal没有seeDoor方法

Animal a2 = new Cat();
a2.shout(); // 喵喵喵 和a1的表现不一样,多态的表现
//a2.catchMouse(); // 编译错误,Animal没有catchMouse方法

Dog d1 = (Dog) a1; // 向下类型转换,手动转型
d1.seeDoor(); // 看门 向下转型后可以调用子类特有的方法

// Dog d2 = (Dog)a2; // Cat -> Dog,idea不会报错,但是编译无法通过
}
}