《Core Java》是 Java 程序員案頭必備經典。本文系統整理其第一卷核心內容:基本程序設計結構、對象與類、關鍵字語義、內存模型、參數傳遞機制,並補充源碼級分析與面試高頻陷阱,作為進階基石。
| 類型 | 位數 | 默認值 | 字面量示例 | 包裝類 |
|---|---|---|---|---|
| byte | 8 | 0 | (byte)10 | Byte |
| short | 16 | 0 | (short)1000 | Short |
| int | 32 | 0 | 100, 0xFF, 0b1010 | Integer |
| long | 64 | 0L | 100L, 0xFFL | Long |
| float | 32 | 0.0f | 1.5f, 1e-3f | Float |
| double | 64 | 0.0 | 1.5, 1e-3 | Double |
| char | 16 | '\u0000' | 'A', '\u0041', '\n' | Character |
| boolean | ~1 | false | true, false | Boolean |
關鍵點:
— int 最常用,byte/short 用於大數組/文件 IO 節省內存。
— 浮點數字面量默認 double,float 必須加 F/f 後綴。
— char 實質是無符號 16 位整數,可參與算術運算。
— 除零行為:整數除零拋 ArithmeticException;浮點數除零得 Infinity/NaN,不拋異常。
局部變量必須顯式初始化,否則編譯報錯。成員變量自動獲得默認值。嚴禁使用未初始化的局部變量。
最佳實踐:static final 定義類常量(如 Math.PI),命名全大寫下劃線分隔。
String 對象創建後內容不可修改,任何「修改」操作都產生新對象。"abc" 自動入池,new String("abc") 強制創建堆對象。intern() 手動入池/獲取池中引用。equals(),地址比較用 ==。switch 支持類型:char, byte, short, int, Character, Byte, Short, Integer, String (Java 7+), enum。case 穿透特性:無 break 繼續執行下一 case。do-while 至少執行一次,適用於菜單交互等場景。Arrays.sort() 使用雙軸快排 (基本類型) / TimSort (對象)。| 關系 | UML 符號 | 代碼體現 | 口訣 |
|---|---|---|---|
| 依賴 | 虛線箭頭 | 方法參數/局部變量使用 B 類 | Use-a (A 用 B) |
| 聚合 | 空心菱形 | 成員變量持有 B 類對象 (可共享) | Has-a (A 有 B) |
| 組合 | 實心菱形 | 成員變量持有 B 類,生命周期綁定 | Contains-a (A 包含 B) |
| 繼承 | 實心三角箭頭 | extends | Is-a (A 是 B) |
Date deadline = new Date(); // 兩步驟:
// 1. new Date():堆上分配對象,調用構造器初始化,返回引用(地址)
// 2. 變量 deadline 棧上存儲該引用(地址)
核心認知:對象變量存儲的是引用(地址),而非對象本身。多個變量可指向同一對象(別名現象)。
Date date = null;
date.toString(); // 拋 NullPointerException:null 無指向對象,無法調用方法
防禦編程:Objects.requireNonNull()、Optional、註解 @NonNull、契約式設計。
new 調用super())this(...) 調用本類其他構造器。
public class Employee {
private String name;
private double salary;
public Employee(String name) { this(name, 0); } // 調用下方構造器
public Employee(String name, double salary) {
this.name = name; // this 區分字段與參數
this.salary = salary;
}
}
ClassName.field 訪問。this,只能訪問靜態成員。典型:Math.sqrt()、System.out (PrintStream 靜態實例)。import static java.lang.Math.*;基本類型:傳遞值的拷貝,方法內修改不影響原值。
引用類型:傳遞引用的拷貝(地址值),方法內可修改對象內部狀態,但無法修改原引用指向。
// 情況1:修改對象狀態 - 生效
public void raiseSalary(Employee e, double percent) {
e.setSalary(e.getSalary() * (1 + percent)); // 修改對象內部字段
}
Employee harry = new Employee("Harry", 50000);
raiseSalary(harry, 0.1); // harry.salary 變為 55000 ✅
// 情況2:嘗試修改引用指向 - 無效
public void swap(Employee a, Employee b) {
Employee temp = a;
a = b; // 修改局部變量 a 指向
b = temp;
}
Employee alice = new Employee("Alice", 60000);
Employee bob = new Employee("Bob", 70000);
swap(alice, bob);
// alice 仍指向 Alice,bob 仍指向 Bob ❌
// 因為 a、b 是 harry/alice 引用的拷貝,修改拷貝不影響原引用
Type... args 本質是數組,優先匹配固定參數| 修飾符 | 同類 | 同包 | 子類(異包) | 非子類(異包) |
|---|---|---|---|---|
| private | ✅ | ❌ | ❌ | ❌ |
| default(包私有) | ✅ | ✅ | ❌ | ❌ |
| protected | ✅ | ✅ | ✅ | ❌ |
| public | ✅ | ✅ | ✅ | ✅ |
/** ... */@param、@return、@throws、@see、@since、@deprecatedjavadoc -d docs -sourcepath src -subpackages com.example這些基石知識是理解集合、併發、JVM、框架原理的前提。建議反覆研讀、動手驗證、構建知識圖譜。