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

Java 靜態代碼塊、實例代碼塊與建構子執行順序深度解析

     編輯:Java 相關知識

前言

在 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

核心概念解析

1. 靜態代碼塊

  • 執行時機:類加載過程的初始化階段(第三步)
  • 主要目的:為類變量(static 變量)賦予初始值
  • 特點:屬於類級別,整個類生命周期中僅執行一次

2. 實例代碼塊(非靜態代碼塊)

  • 執行時機:每次創建對象實例時,在建構子之前執行
  • 本質:編譯器會將其複製到每個建構子的開頭
  • 用途:初始化共有的實例變量,減少重複代碼

3. 建構子

  • 執行時機:實例代碼塊執行完畢後
  • 用途:完成對象的個性化初始化

執行順序總結

  1. 父類靜態代碼塊 → 子類靜態代碼塊(類級別,優先執行)
  2. 父類實例代碼塊 → 父類建構子
  3. 子類實例代碼塊 → 子類建構子(實例級別,後執行)

簡言之:靜態代碼塊 > 實例代碼塊 > 建構子,且父類優於子類。

深度理解

此順序體現了 Java 初始化的邏輯:先完成類級別的準備工作(靜態初始化),再進行實例級別的構建。繼承鏈上,父類必須先完成初始化,子類才能在其基礎上構建。這也是為什麼建構子第一行隱含或顯式調用 super() 的根本原因。

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