在 Java 類初始化過程中,靜態代碼塊、實例代碼塊(非靜態代碼塊)以及建構子三者的執行順序常令初學者困惑。本文將透過實際代碼範例,詳細剖析它們的執行機制與順序關係。
觀察以下繼承關係下的執行結果:
package com.test;
public class HelloB extends HelloA {
public HelloB() { }
{
System.out.println("I'm B class");
}
static {
System.out.println("static B");
}
public static void main(String[] args) {
new HelloB();
}
}
class HelloA {
public HelloA() { }
{
System.out.println("I'm A class");
}
static {
System.out.println("static A");
}
}
執行輸出:
static A static B I'm A class I'm B class
簡言之:靜態代碼塊 > 實例代碼塊 > 建構子,且父類優於子類。
此順序體現了 Java 初始化的邏輯:先完成類級別的準備工作(靜態初始化),再進行實例級別的構建。繼承鏈上,父類必須先完成初始化,子類才能在其基礎上構建。這也是為什麼建構子第一行隱含或顯式調用 super() 的根本原因。