核心概念速覽
| 特性 | 核心思想 | 代碼體現 | 設計目的 |
| 抽象 | 忽略非本質細節,提取共性屬性/行為 | 接口、抽象類、類定義 | 降低複雜度,建立領域模型 |
| 封裝 | 數據與操作綁定,隱藏內部實現 | private 字段 + public getter/setter | 數據安全、實現細節隔離、易維護 |
| 繼承 | 子類復用父類邏輯,建立 IS-A 關系 | extends、super、方法重寫 | 代碼復用、擴展性、多態前提 |
| 多態 | 同一接口,不同實現,運行期綁定 | 向上轉型、方法重寫、接口實現、重載 | 解耦、靈活替換、開閉原則 |
深度拆解
1. 抽象:從具體到本質
例子:Student 類只關注 score、exam(),忽略身高、慣用手等無關屬性。抽象是建模的藝術,決定了系統的邊界與詞彙表。
2. 封裝:不只是 private + getter/setter
- 數據校驗:
setAge(int age) { if (age < 0) throw new IllegalArgumentException(); this.age = age; }
- 只讀/只寫控制:僅提供 getter 或 setter。
- 未來兼容:內部存儲從
int age 改為 LocalDate birthday,外部調用 getAge() 完全無感 —— 「你可以改變主意,而不破壞任何客戶代碼」。
3. 繼承:IS-A 原則與里氏替換
- 子類必須是父類的特化(如
Cat extends Animal),而非單純復用代碼(Util extends ArrayList 即反模式)。
final 類/方法禁止繼承/重寫,保護核心邏輯不被篡改。
- 組合優於繼承:
class Car { Engine engine; } 優於 class Car extends Engine。
4. 多態:靜態 vs 動態
| 類型 | 別名 | 綁定時機 | 典型形式 |
| 靜態多態 | 編譯期多態 | 編譯期 | 方法重載、泛型 |
| 動態多態 | 運行期多態 | 運行期 | 方法重寫、接口實現、向上轉型 |
// 動態多態經典場景
List list = new ArrayList<>(); // 接口類型引用指向具體實現
list.add("hello"); // 運行期調用 ArrayList.add()
list = new LinkedList<>(); // 替換實現,業務代碼零修改
最佳實踐原則
- 面向接口編程:變量聲明用接口/抽象類,具體實現由 DI 容器注入。
- 高內聚低耦合:封裝變化點(策略模式、模板方法模式)。
- 里氏替換原則 (LSP):子類必須能無縫替換父類,不破壞契約。
- 開閉原則 (OCP):對擴展開放,對修改關閉 —— 多態是關鍵支撐。