Java 提供 abstract class 和 interface 兩種抽象類型定義機制,二者相似度高、甚至可互換,導致許多開發者選型隨意。實則二者差異深刻,選型直接反映對問題領域本質的理解。本文從語法層面、設計哲學、演化歷史三個維度深度剖析,給出明確選型依據。
| 特性 | abstract class | interface (Java 7 及之前) |
|---|---|---|
| 繼承關係 | 單繼承 (extends) | 多實現 (implements) |
| 字段 | 任意修飾符、非 final | 隱含 public static final |
| 方法 | 可有抽象/具體/私有/靜態方法 | 隱含 public abstract 實例方法 |
| 構造器 | 有(供子類鏈調用) | 無 |
| 默認方法 | 天然支持 | Java 8+ 支持 default |
| 靜態方法 | 支持 | Java 8+ 支持 |
| 私有方法 | 支持 | Java 9+ 支持 |
Animal、Vehicle、AbstractList。子類 IS-A 關係強。Serializable、Comparable、Runnable。實現類 HAS-A 能力關係。Abstract Class 勝在默認實現:新增方法可提供默認實現,現有子類零修改。
Interface (pre-Java 8) 痛點:新增方法 = 破壞所有實現類,維護成本極高。
Java 8+ Default Methods 緩解但未消除:默認方法無法訪問實例狀態,複雜邏輯仍需抽象類協作。
public abstract class HttpHandler {
// 模板方法:定義算法骨架
public final void handle(Request req, Response resp) {
authenticate(req);
doHandle(req, resp); // 子類實現
logAccess(req, resp);
}
protected abstract void doHandle(Request req, Response resp);
private void authenticate(Request req) { ... }
private void logAccess(Request req, Response resp) { ... }
}
public interface PaymentStrategy {
void pay(BigDecimal amount);
}
public class AlipayStrategy implements PaymentStrategy { ... }
public class WechatPayStrategy implements PaymentStrategy { ... }
public class OrderService {
private PaymentStrategy strategy; // 依賴抽象
public void checkout(BigDecimal amount) { strategy.pay(amount); }
}
OrderService| 版本 | Interface 新能力 | 對選型的影響 |
|---|---|---|
| Java 8 | default/靜態方法 | 接口可演化,減少抽象類作為「工具類集合」的需求 |
| Java 9 | 私有方法 | 接口內部復用邏輯更乾淨,進一步模糊邊界 |
| Java 17+ | sealed interface | 可限制實現類範圍,接口獲得「受控繼承」能力 |
但核心差異未變:接口仍無構造器、無實例字段、無法強制初始化邏輯。
abstract classinterfaceinterface (Marker Interface)interface + default (Java 8+) 或 final class + 靜態方法Collection、List、Set、Map → Interface(定義契約)AbstractCollection、AbstractList、AbstractMap → Abstract Class(提供默認實現、共享 size/modCount 等狀態)ArrayList → extends AbstractList implements List, RandomAccess, Cloneable, Serializable雙層設計 = 契約穩定 + 實現靈活 + 代碼復用最大化。
Abstract Class 為「共享實現」服務,Interface 為「定義契約」服務。
選型時問自己:我是在提煉「共同骨架」還是「對外承諾」?
掌握這一本質,你的類圖將不再隨意,而是精準表達領域模型的結構意圖。