假设设计「防盗门」系统:门具备「开/关」,锁具备「上锁/开锁」。面向对象原则中,防盗门 是一个 门,拥有 一把锁。Java 单继承限制下,防盗门无法同时继承 Door 和 Lock 类。接口正是解决此类「能力组合」问题的核心机制——定义行为契约,而非实现细节。
接口是公共行为规范的集合,仅包含方法签名(Java 8 前),无实现代码。对比抽象类:
| 维度 | 抽象类 | 接口 |
|---|---|---|
| 方法实现 | 可包含具体方法 | 仅抽象方法(Java 8 前) |
| 成员变量 | 任意类型 | 仅 public static final 常量 |
| 静态成员 | 支持静态方法/代码块 | Java 8+ 支持静态/默认方法 |
| 继承关系 | 单继承 | 多实现,接口间可多继承 |
| 设计目的 | 代码复用(is-a) | 能力扩展(has-a/can-do) |
// 定义接口
public interface Lockable {
void lock();
void unlock();
}
// 实现接口
public class AntiTheftDoor extends Door implements Lockable {
private Lock lock;
@Override
public void lock() { lock.lock(); }
@Override
public void unlock() { lock.unlock(); }
}
Java 8 引入 default 和 static 方法,实现接口向后兼容扩展:
public interface Loggable {
// 默认方法:实现类可不重写
default void log(String msg) {
System.out.println("[LOG] " + msg);
}
// 静态方法:工具方法,不可被重写
static Loggable create() {
return new Loggable() {};
}
}
解决了「接口新增方法导致所有实现类必须修改」的痛点,Collection 接口新增 stream()、forEach() 即为此例。
// 支付策略接口
public interface PaymentStrategy {
void pay(BigDecimal amount);
}
// 具体实现
public class AlipayStrategy implements PaymentStrategy { ... }
public class WechatPayStrategy implements PaymentStrategy { ... }
// 上下文使用
public class OrderService {
public void checkout(Order order, PaymentStrategy strategy) {
strategy.pay(order.getAmount());
}
}
接口实现了算法族封装与运行时动态切换,是开闭原则(OCP)落地的关键。
接口是 Java 多态的基石,定义「做什么」而非「怎么做」。优秀接口设计遵循:单一职责、依赖倒置、接口隔离。理解接口与抽象类的本质区别,善用默认方法演进 API,是构建可扩展、低耦合系统的核心能力。