static、final、泛型是 Java 語言的三大基石特性。本文系統梳理其語法規則、語義含義、內存模型、最佳實踐與常見誤區。
| 修飾目標 | 語義 | 關鍵規則 |
|---|---|---|
| 類 | 不可繼承 | 無子類,方法隱式 final |
| 方法 | 不可重寫 | 可繼承、可重載、編譯期內聯優化 |
| 基本類型變量 | 值不可改 | 編譯期常量折疊,必須顯式初始化 |
| 引用類型變量 | 引用不可換 | 對象內部狀態仍可修改(如 final List 可 add) |
| 構造器 | ❌ 不可修飾 | 構造器本身不被繼承,無 final 必要 |
this/super
static {
// 類加載時執行,僅一次
// 用途:初始化靜態資源、加載原生庫、註冊驅動
System.loadLibrary("native-lib");
CONFIG = loadConfig();
}
多個靜態塊按聲明順序執行,可穿插在靜態字段之間。
private static final
private static final String CONSTANT = "VALUE";
// 編譯期常量折疊,字節碼中直接內聯常量值
// 類初始化時賦值,線程安全(JVM 類加載鎖保證)
ClassCastExceptionList list = ...; String s = list.get(0); 無需 (String)List → List,T → Object(無界限)或 Bound(有界限)| 語法 | 含義 | 適用場景 |
|---|---|---|
extends T | 上界通配符(生產者) | 只讀取,如 copy(List extends Number> src) |
super T | 下界通配符(消費者) | 只寫入,如 fill(List super Integer> dst) |
> | 無界通配符 | 類型無關操作,如 size(), clear() |
Producer Extends, Consumer Super
從集合讀取元素 → 用extends;向集合寫入元素 → 用super。
new ArrayList(); 右側鑽石操作符 JDK7+ 可省略類型參數new List[10] 編譯錯誤 → 用 List>
static T field; 非法instanceof List 非法 → 用 instanceof List>