《Thinking in Java》開篇即確立核心主題:**編程語言演進本質是人類利用計算機解決問題的思維演進**。第 1 章「面向對象導論」以哲學高度定義 OOP 五大基石,本文提煉核心觀點並結合現代視角註釋。
| 階段 | 代表語言 | 抽象對象 | 核心限制 |
|---|---|---|---|
| 機器碼/匯編 | Machine Code | 硬體指令、暫存器、記憶體地址 | 極度依賴硬體架構 |
| 命令式/過程式 | Fortran, C, Basic | 變量、函數、控制流 (機器模型的抽象) | 程序員需建立「機器模型 → 問題模型」映射,認知負擔重 |
| 特定問題導向 | Lisp, APL, SQL | 特定領域概念 (列表、陣列、關係) | 領域侷限,通用性差 |
| 面向對象 | Smalltalk, C++, Java, C# | 問題空間實體 (對象) | 提供表示問題元素的通用工具,語言適應問題 |
核心洞見:OOP 允許我們**向語言添加新類型**來適應特定問題,而非強迫問題適應語言內建類型。這是「擴展語言」而非「使用語言」的根本區別。
List<Animal> 可調用 animal.makeSound() 無需知悉具體子類。== vs equals())。List 介面定義 add/get/size,ArrayList/LinkedList 提供不同實現。List<String> list = new ArrayList<>();,解耦調用者與具體實現。| 維度 | 繼承類型 (Is-a) | 組合/委派 (Has-a) |
|---|---|---|
| 關係 | 子類是父類的特化 | 類包含組件對象 |
| 耦合度 | 高 (破壞封裝,父類變更波及子類) | 低 (組件可替換) |
| 復用方式 | 繼承實現代碼 (protected 方法/字段) | 委派調用組件方法 |
| 設計原則 | 里氏替換原則 (LSP) 必須滿足 | 組合優於繼承 (GoF) |
現代觀點:繼承主要用於**建立類型層次** (介面繼承/抽象類模板方法),**代碼復用優先用組合**。Java 單繼承限制強化了這一導向。
Animal a = new Cat(); 子類引用賦值給父類變量。a.makeSound() 編譯期綁定 Animal.makeSound(),運行期分派到 Cat.makeSound()。問題空間實體
↓ 建模
對象 (狀態 + 行為 + 標識)
↓ 分類抽象
類 (介面 + 實現) ──→ 類型層次 (繼承/實現)
↓ 面向介面使用
多態 (動態綁定) ──→ 解耦、擴展、統一處理
↓ 組合裝配
系統架構 (高內聚、低耦合)
第一章雖無代碼,卻確立了 Java 程序員的**世界觀**:代碼不再是指令序列,而是**對象社區**;設計不再是函數分解,而是**類型層次與協作契約**的構建。這正是「Java 編程思想」的靈魂所在。