public class A {
private List list = new ArrayList(); // 實例字段初始化
public static void main(String[] args) {
A a = new A();
}
}
實例化時(`new A()` 時),而非加載時。屬於實例字段初始化,在構造器之前執行。
類初始化階段,在 `main` 執行前、任何靜態成員訪問前、實例化前。只執行一次。
public class OrderDemo {
// 1. 靜態字段初始化
static String sField = initStaticField();
static { System.out.println("2. 靜態塊"); }
// 3. 實例字段初始化
String iField = initInstanceField();
{ System.out.println("4. 實例塊"); }
// 5. 構造器
public OrderDemo() { System.out.println("5. 構造器"); }
public static void main(String[] args) {
System.out.println("6. main 開始");
new OrderDemo();
System.out.println("7. main 結束");
}
static String initStaticField() { System.out.println("1. 靜態字段"); return ""; }
String initInstanceField() { System.out.println("3. 實例字段"); return ""; }
}
/* 輸出順序:
1. 靜態字段
2. 靜態塊
6. main 開始
3. 實例字段
4. 實例塊
5. 構造器
7. main 結束
*/
父類靜態字段 → 父類靜態塊 → 子類靜態字段 → 子類靜態塊
→ 父類實例字段 → 父類實例塊 → 父類構造器
→ 子類實例字段 → 子類實例塊 → 子類構造器
被動使用不觸發初始化:訪問父類靜態字段(子類不初始化)、數組創建、訪問 `final static` 常量(編譯期常量池)。