接口实现多态的核心是同一接口引用指向不同实现类对象并执行各自逻辑,依赖“能力契约”而非继承,支持多实现与接口多继承,使代码松耦合、易扩展。

通过接口实现多态,核心在于“同一接口引用,指向不同实现类对象,调用时执行各自的具体逻辑”。它不依赖继承关系,而是靠“能力契约”来统一行为入口,让代码更松耦合、更易扩展。
接口是能力的抽象,不是具体实现
接口只定义方法签名(比如 void start()、int getSpeed()),不提供具体代码。任何类只要声明 implements 该接口,就必须给出全部方法的实现。这相当于承诺:“我具备这种能力”,而具体怎么干,由每个类自己决定。
- 接口不能被 new,只能被实现
- 一个类可以同时实现多个接口(如 class Car implements Drivable, Flyable, Chargeable)
- 接口之间可以多继承(interface ElectricCar extends Drivable, Chargeable)
写法上分三步走
以 Flyable 接口为例:
- 定义接口:public interface Flyable { void fly(); }
-
多个类实现它:
class Bird implements Flyable { public void fly() { System.out.println("扑腾翅膀飞"); } }
class Airplane implements Flyable { public void fly() { System.out.println("引擎推进飞"); } } -
用接口类型变量调用:
Flyable f1 = new Bird();
Flyable f2 = new Airplane();
f1.fly(); // 输出“扑腾翅膀飞”
f2.fly(); // 输出“引擎推进飞”
关键细节决定是否真有多态
只有满足以下条件,才能触发运行时动态绑定,真正体现多态:
- 变量声明类型必须是接口(不是具体实现类)
- 实际创建的是实现了该接口的不同类的对象
- 调用的是接口中定义的方法(且各实现类提供了不同逻辑)
- 不能通过接口变量访问实现类独有的字段或方法(会编译报错)
为什么推荐用接口而非继承来实现多态
接口更适合表达“能做什么”,而不是“是什么”。比如 Dog 和 Drone 完全无关,但都能 makeSound() 或 move()。用接口就能让它们共用同一套处理逻辑:
- 方法参数可直接写成 void operate(Flyable device),传入 Bird 或 Airplane 都行
- 新增一种飞行器(比如 Rocket),只需新写一个类实现 Flyable,原有调用代码完全不用改
- 避免单继承限制——一个类无法继承多个父类,但可以实现多个接口










