《瘋狂 Java 講義》第 2 章精華:面向對象核心思想與 UML 建模實戰
本章系統闡述從結構化程序設計到面向對象的思維轉變,深度解析封裝、繼承、多態三大特征,並引入 UML 統一建模語言作為溝通藍圖。以下為核心知識點提煉與實戰擴展。
1. 兩種思維的本質對決
| 維度 | 結構化(面向過程) | 面向對象 |
| 核心單元 | 函數/模塊 | 類/對象 |
| 分解方式 | 自頂向下,功能遞歸分解 | 業務領域建模,對象職責分配 |
| 數據與行為 | 分離:數據結構 + 操作函數 | 封裝:成員變量 + 方法 = 類定義 |
| 擴展機制 | 修改現有函數/增加函數 | 繼承/組合/多態,開閉原則 |
| 認知負荷 | 需理解全局調用鏈 | 局部封裝,符合人類直覺 |
經典比喻:組裝電腦
- 面向過程:採購二極管、電阻、晶體管 → 焊接電路板 → 組裝機箱
- 面向對象:採購 CPU、主板、內存、硬盤 → 插槽組裝 → 開機
- 對象粒度更大,復用度更高,維護成本更低
語言直觀性對比
// 面向過程:動詞居中,主賓語模糊
eat(豬八戒, 西瓜);
// 面向對象:名詞居中,主謂賓清晰
豬八戒.吃(西瓜); // 更接近自然語言
2. 面向對象三大特征深度解析
封裝:信息隱藏與契約承諾
- 核心:將實現細節隱藏,暴露公共接口
- 實現:
private 字段 + public getter/setter + 參數校驗
- 進階:不可變對象(final 字段、無 setter、構造器注入)、防御性拷貝
- 意義:降低耦合、便於變更、保證不變約束
繼承:IS-A 關係與代碼復用
- 語義:子類是父類的一種特殊形式(里氏替換原則)
- 機制:獲得父類非 private 成員、可覆寫方法、可添加新成員
- 陷阱:濫用繼承導致脆弱基類問題、層次過深難維護
- 原則:優先組合,必要時繼承;最終類用
final 禁止繼承
多態:同一接口,多種實現
- 三要素:繼承/實現 + 方法覆寫 + 父類引用指向子類對象
- 靜態綁定:編譯期確定(private、static、final、構造器方法)
- 動態綁定:運行期根據實際對象類型分派(虛方法表機制)
- 應用:策略模式、模板方法、依賴倒置、插件架構
3. 類與對象:模板與實例
// 類 = 狀態數據(成員變量) + 行為(方法)
public class Person {
// 狀態
private String name;
private int age;
// 行為
public void eat(String food) { ... }
public void sleep() { ... }
}
// 對象 = 類的具體實例,佔據堆內存
Person p1 = new Person("張三", 25);
Person p2 = new Person("李四", 30);
關鍵區別
- 類是抽象概念,不佔業務數據內存(僅元空間存類元數據)
- 對象是具體實體,擁有唯一標識、獨立狀態、生命週期
new 關鍵字觸發:內存分配 → 默認初始化 → 構造器執行 → 返回引用
4. UML 統一建模語言:溝通的通用語言
核心圖表分類
| 類別 | 圖表 | 用途 |
| 結構圖 | 類圖 | 類、接口、關係(繼承、實現、關聯、依賴、聚合、組合) |
| 對象圖 | 運行時對象快照,驗證類圖正確性 |
| 組件圖 | 物理組件依賴,架構設計 |
| 部署圖 | 硬件節點與軟件分佈,運維視角 |
| 行為圖 | 用例圖 | 參與者與功能需求,需求分析 |
| 序列圖 | 對象交互時間順序,業務流程 |
| 狀態圖 | 對象生命週期狀態遷移 |
| 活動圖 | 流程控制與數據流,業務邏輯 |
類圖關係強度排序
實現 < 依賴 < 關聯 < 聚合 < 組合 < 繼承
(弱) (強)
- 依賴:方法參數、局部變量、靜態方法調用
- 關聯:成員變量引用,雙向/單向、多重度
- 聚合:整體-部分,部分可獨立存在(空心菱形)
- 組合:整體-部分,部分不可獨立,生命週期綁定(實心菱形)
- 繼承:泛化關係,IS-A(空心三角箭頭)
- 實現:接口實現,虛線空心三角箭頭
5. Java 面向對象語法映射
| 概念 | Java 關鍵字/機制 |
| 類定義 | class、interface、enum、record (Java 14+) |
| 封裝 | private/protected/public、getter/setter |
| 繼承 | extends、super、final、@Override |
| 多態 | 向上轉型、動態分派、instanceof、模式匹配 (Java 16+) |
| 抽象 | abstract class、interface、default/static 方法 (Java 8+) |
| 對象創建 | new、工廠模式、構建者模式、反射、序列化反序列化 |
| 對象比較 | == (引用)、equals() (值)、比較器 |
6. 實戰設計原則(SOLID 前身)
- 單一職責:類只負責一個業務領域
- 開閉原則:對擴展開放,對修改關閉(多態實現)
- 里氏替換:子類必須能替換父類不破壞業務
- 接口隔離:接口細粒度,不強制依賴無用方法
- 依賴倒置:高層模塊依賴抽象,不依賴具體實現
「面向對象不是語法糖,而是一種建模思維。掌握封裝邊界、繼承契約、多態分派、UML 表達,才能駕馭複雜系統,寫出經得起變化的代碼。」