《Thinking in Java》(第 4 版)被公認為 Java 經典必讀。本文整理前三章核心心得:對象導論、一切皆對象、操作符,重點梳理抽象、封裝、繼承、多態、內存模型、基本類型、操作符細節等基石知識,並結合實踐經驗補充說明。
第 1 章:對象導論
1.1 抽象:面向問題建模,而非面向機器
- C 語言抽象基於計算機結構(內存、寄存器、指針)。
- Java 抽象基於問題領域:將現實概念直接映射為對象(如「賬戶」、「訂單」),程序員擴展新類型適應問題,而非受限於機器類型。
1.2 物件導向五大基本特性
- 萬物皆對象:對象封裝狀態(字段)與行為(方法),可從問題域提取任意概念建模。
- 程序是對象集合:通過發送消息(調用方法)協作。
- 每個對象有自己的存儲:由現有對象組合/繼承生成新對象。
- 每個對象有類型:每個對象是某個類的實例。
- 同類對象可接收相同消息:多態——子類可替換父類。
1.3 類與對象
- 類 = 自定義數據類型,描述同特性/行為的對象集合。
- 面向對象三大支柱:封裝、繼承、多態。
- 封裝:隱藏內部細節,對外暴露接口,訪問控制(public/private/protected/default)實現「隱藏實現、隔離變化」。
- 繼承:複用現有類創建新類型,子類擁有父類非 private 成員,實現「is-a」關係。Java 單根繼承(Object 為根),利於通用接口、垃圾回收、參數傳遞。
- 多態:向上轉型(子類引用賦給父類變量),運行時動態綁定調用具體實現(方法覆蓋)。編譯期靜態綁定(重載)vs 運行期動態綁定(覆蓋)。
1.4 代碼複用:組合 vs 繼承
- 組合(HAS-A):靈活、耦合度低,優先選擇。
- 繼承(IS-A):需使用父類接口、實現多態時選擇。
1.5 容器與泛型
- JDK 5 前容器存 Object,取出需向下轉型,不安全。
- 泛型提供編譯期類型安全,明確容器持有元素類型。
第 2 章:一切皆對象
2.1 對象存儲位置:五大區域
| 區域 | 位置 | 特點 | 存儲內容 |
| 寄存器 | CPU 內部 | 最快,編譯器管理,程序不可控 | — |
| 棧 | RAM | 速度快,生命周期確定,自動釋放 | 基本類型值、對象引用、方法幀 |
| 堆 | RAM | 靈活,GC 管理,分配較慢 | 所有 new 出來的對象 |
| 常量存儲 | 代碼段/ROM | 只讀 | 字面量、final 常量 |
| 非 RAM 存儲 | 磁盤/數據庫 | 持久化 | 序列化對象、文件 |
2.2 基本類型:固定大小,跨平台一致
| 類型 | 位數 | 字節 | 範圍/精度 | 包裝類 |
| boolean | ~1 | — | true/false | Boolean |
| char | 16 | 2 | Unicode 0~65535 | Character |
| byte | 8 | 1 | -128 ~ 127 | Byte |
| short | 16 | 2 | -32768 ~ 32767 | Short |
| int | 32 | 4 | -2^31 ~ 2^31-1 | Integer |
| long | 64 | 8 | -2^63 ~ 2^63-1 | Long |
| float | 32 | 4 | IEEE 754 單精度 | Float |
| double | 64 | 8 | IEEE 754 雙精度 | Double |
| void | — | — | 無返回值 | Void |
- 所有數值類型有符號;JDK 5 自動裝箱/拆箱簡化基本類型與包裝類轉換。
- 高精度:
BigInteger(任意精度整數)、BigDecimal(任意精度定點數,金融必用)。
2.3 作用域與生命周期
- 花括號
{} 定義作用域,局部變量隨作用域結束銷毀。
- 對象生命周期不受作用域限制,由 GC 管理,可能長期存活。
2.4 類、字段、方法細節
- 字段(成員變量)有默認值:數值 0、boolean false、引用 null、char '\u0000'。
- 局部變量無默認值,編譯器強制初始化。
- 方法參數傳遞:值傳遞(基本類型傳值,引用類型傳引用的值/別名)。
static 修飾字段/方法屬於類,無需實例即可訪問;修飾內部類表示非內部類。
第 3 章:操作符
3.1 優先級與賦值
- 優先級:括號 > 單目 > 算術 > 移位 > 關係 > 邏輯 > 三元 > 賦值。
- 賦值:基本類型複製值;引用類型複製引用(指向同一對象)。
3.2 關係、邏輯、位、移位操作符
==:基本類型比值,引用類型比地址;對象內容比較用 equals()(需重寫)。
- 短路邏輯:
&&、||,左側能決定結果則不執行右側。
- 位操作:
&、|、^、~,僅適用整數類型。
- 移位:
<<(左移補 0,×2^n)、>>(算術右移,符號位擴展,÷2^n)、>>>(邏輯右移,高位補 0)。
- 移位位數取模:int 只看低 5 位(模 32),long 只看低 6 位(模 64)。
3.3 經典位操作技巧:& 0xFF
byte b = -4; // 二進制補碼:11111100
int i = b & 0xFF; // 結果:252 (00000000 00000000 00000000 11111100)
原因:byte 參與運算自動提升為 int,負數會符號擴展(高位填 1)。& 0xFF 保留低 8 位,清零高 24 位,得到無符號字節值。常用於網絡協議、圖像處理、加密算法中字節操作。
實戰補充:避坑指南
- 浮點數比較:絕對不用
==,用 Math.abs(a-b) < EPSILON 或 BigDecimal。
String 不可變:s1 + s2 產生新對象,循環拼接用 StringBuilder。
- 自動裝箱陷阱:
Integer a = 1000, b = 1000; a == b → false(緩存範圍 -128~127)。比較值用 equals()。
- 移位運算優先級低於加減:
1 << 2 + 3 = 1 << 5 = 32,非 (1<<2)+3=7。加括號!
總結
前三章奠定了 Java 程序員的思維基石:用對象建模業務、理解內存模型驅動性能決策、掌握操作符細節避免低級錯誤。建議動手敲碼驗證每個知識點,形成肌肉記憶。
- 上一篇文章: Java 命名規範全攻略:包、類、方法、變量與駝峰法細節
- 下一篇文章: Java 經典兔子問題:費波那契數列遞歸與迭代實現
Copyright ©
程式碼之家 All Rights Reserved