跳转至

多态

一、什么是多态

父类引用指向子类对象,调用方法时实际执行子类重写的版本。

Animal a = new Dog();
a.speak();   // 执行 Dog 的 speak

二、三个条件

  1. 继承。
  2. 重写。
  3. 父类引用指向子类对象。

三、实现机制

静态分派(重载)

编译期确定:

void method(Animal a) {}
void method(Dog d) {}

看引用类型,编译期决定。

动态分派(重写)

运行期确定:

Animal a = new Dog();
a.speak();   // 看实际对象类型

invokevirtual 指令查虚方法表。

四、好处

  • 可扩展。
  • 代码复用。
  • 面向接口编程。

五、例子

interface Shape { void draw(); }
class Circle implements Shape { ... }
class Rect implements Shape { ... }

void drawShape(Shape s) { s.draw(); }

drawShape 不关心具体类型。

一句话

多态 = 同一方法,不同表现。