首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

深入淺出 Java 靜態區塊、實例區塊與建構子執行順序

     編輯:Java 相關知識

前言

在 Java 類別初始化的過程中,靜態區塊、實例區塊(非靜態區塊)以及建構子的執行順序常讓開發者感到困惑。本文將透過程式碼範例與執行結果,清晰解析三者的載入時機與呼叫順序,幫助你建立正確的觀念。

核心概念

  • 靜態區塊(static block):使用 static { ... } 宣告,屬於類別層級,在類別被類別載入器載入時僅執行一次,優先於主方法與任何實例建立。
  • 實例區塊(instance block):直接使用 { ... } 宣告,屬於物件層級,在每次建立新物件時執行,且早於建構子。
  • 建構子:在實例區塊執行完畢後執行,負責完成物件的最終初始化。

程式碼範例與解析

以下範例展示了父類別、子類別、靜態區塊、實例區塊與建構子混合時的完整執行流程:

public class ExecutionOrderDemo {

    // 1. 父類別靜態區塊
    static {
        System.out.println("父類別:靜態區塊");
    }

    // 2. 父類別實例區塊
    {
        System.out.println("父類別:實例區塊");
    }

    // 3. 父類別建構子
    public ExecutionOrderDemo() {
        System.out.println("父類別:建構子");
    }

    // 4. 子類別靜態區塊
    static class Child extends ExecutionOrderDemo {
        static {
            System.out.println("子類別:靜態區塊");
        }

        {
            System.out.println("子類別:實例區塊");
        }

        public Child() {
            System.out.println("子類別:建構子");
        }
    }

    public static void main(String[] args) {
        System.out.println("=== 主方法開始 ===");
        new Child();
        System.out.println("=== 建立第二個子類別實例 ===");
        new Child();
    }
}

執行結果

父類別:靜態區塊
子類別:靜態區塊
=== 主方法開始 ===
父類別:實例區塊
父類別:建構子
子類別:實例區塊
子類別:建構子
=== 建立第二個子類別實例 ===
父類別:實例區塊
父類別:建構子
子類別:實例區塊
子類別:建構子

順序總結

  1. 靜態區塊:父類別 → 子類別(類別載入階段,僅一次)。
  2. 主方法:開始執行。
  3. 實例化物件時:父類別實例區塊 → 父類別建構子 → 子類別實例區塊 → 子類別建構子(每次 new 皆重複)。

常見誤區提醒

  • 實例區塊不等於建構子,它是在建構子之前執行,且每個建構子都會隱性呼叫實例區塊。
  • 靜態區塊無法存取非靜態成員(如實例變數、this 關鍵字)。
  • 若類別未被主動使用(如僅存取靜態常數),可能不會觸發類別初始化,靜態區塊也不會執行。

結語

掌握「靜態優先、父優於子、實例區塊早於建構子」這條主軸,即可輕鬆推導任何複雜繼承體系下的初始化順序。實務上,靜態區塊常用於載入原生庫或初始化單例;實例區塊則適合多建構子共用的初始化邏輯,避免程式碼重複。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved