三類代碼塊定義與執行時機
| 類型 | 語法 | 執行時機 | 執行次數 | 典型用途 |
| 普通代碼塊 | 方法內 { ... } | 方法調用時,按順序執行 | 每次調用 | 限制變量作用域、邏輯分組 |
| 構造代碼塊 | 類內 { ... } | 創建對象時,優於構造器執行 | 每次 new | 多構造器公共初始化邏輯 |
| 靜態代碼塊 | static { ... } | 類加載時(JVM 首次使用類) | 僅一次 | 靜態資源初始化、單例創建、註冊驅動 |
執行順序鐵律
靜態代碼塊/靜態字段初始化(按定義順序)
↓
main() 方法入口
↓
構造代碼塊/實例字段初始化(按定義順序)
↓
構造器方法體
代碼驗證
public class Demo {
{ System.out.println("構造代碼塊"); }
static { System.out.println("靜態代碼塊"); }
public Demo() { System.out.println("構造器"); }
public static void main(String[] args) {
System.out.println("main 開始");
new Demo();
System.out.println("---");
new Demo();
}
}
// 輸出:
// 靜態代碼塊
// main 開始
// 構造代碼塊
// 構造器
// ---
// 構造代碼塊
// 構造器
繼承鏈中的執行順序
父類靜態代碼塊 → 子類靜態代碼塊 → 父構造代碼塊 → 父構造器 → 子構造代碼塊 → 子構造器
關鍵限制
- 靜態代碼塊不能在方法內部定義
- 靜態代碼塊不能直接訪問實例變量/方法,需通過對象引用
- 構造代碼塊隸屬於對象,可訪問所有成員
最佳實踐
- JDBC 驅動註冊、單例模式饿漢式初始化 →
static { }
- 多構造器共享邏輯(如集合初始化、配置加載) → 構造代碼塊
- 方法內臨時變量隔離、複雜邏輯分段 → 普通代碼塊