Java 規範要求:對象在使用前必須被正確初始化。本文系統梳理基本類型默認值、顯式初始化、構造器初始化、初始化順序、靜態初始化、非靜態塊、繼承鏈初始化全流程。
| 類型 | 默認值 |
|---|---|
| boolean | false |
| char | '\u0000' (空字符) |
| byte/short/int/long | 0 |
| float/double | 0.0 |
| 引用類型 | null |
驗證代碼:定義類 Default 包含所有基本類型字段,new Default() 後直接打印,均為上述默認值。
int i = 24;int j = initValue();int k = i + 1;構造器中賦值可在運行期根據參數決定,靈活性最高。執行順序:默認值 → 顯式初始化 → 構造器代碼。
class OrderTest {
static { System.out.println("靜態塊"); }
{ System.out.println("非靜態塊"); }
public OrderTest() { System.out.println("構造器"); }
public static void main(String[] args) {
new OrderTest(); new OrderTest();
}
}
// 輸出:
// 靜態塊
// 非靜態塊
// 構造器
// 非靜態塊
// 構造器
static 字段:類級別,僅一份存儲。static { ... },用於複雜靜態初始化邏輯。Class.forName()。super() 隱式或顯式調用)。class Base { static { p("Base 靜態"); } { p("Base 非靜態"); } Base() { p("Base 構造"); } }
class Derived extends Base { static { p("Derived 靜態"); } { p("Derived 非靜態"); } Derived() { p("Derived 構造"); } }
// new Derived() 輸出:
// Base 靜態
// Derived 靜態
// Base 非靜態
// Base 構造
// Derived 非靜態
// Derived 構造
Class 對象。Class 對象,GC 回收。| 階段 | 執行次數 | 執行順序 | 備註 |
|---|---|---|---|
| 靜態字段/塊 | 1 次(類載入) | 代碼順序,父類優先 | 不可訪問實例成員 |
| 非靜態字段/塊 | 每次 new | 代碼順序,父類優先 | 優於構造器 |
| 構造器 | 每次 new | 父類 → 子類 | 隱式調用 super() |
ExceptionInInitializerError 導致類不可用。