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

Java 初始化順序經典面試題:static、構造塊、建構子與繼承的執行流程詳解

     編輯:Java 綜合教學

Java 初始化順序經典面試題:static、構造塊、建構子與繼承的執行流程詳解

本文透過一道經典的 static 與 extends 結合的題目,徹底理清 Java 類載入與物件初始化的完整順序。

程式碼範例

package com.you.hbxs.model;

class Parent {
    public Parent() { System.out.println("Parent"); }
    { System.out.println("I'm your parent!"); }
    static { System.out.println("靜態Parent!"); }
}

public class Child extends Parent {
    public Child() { System.out.println("Child"); }
    { System.out.println("I'm your child!"); }
    static { System.out.println("靜態Child!"); }

    public static void main(String[] args) {
        System.out.println("--------開始-----------");
        new Child();
        new Child();
        System.out.println("--------結束-----------");
    }
}

執行結果

靜態Parent!
靜態Child!
--------開始-----------
I'm your parent!
Parent
I'm your child!
Child
I'm your parent!
Parent
I'm your child!
Child
--------結束-----------

詳細執行流程分析

  1. 類載入階段(僅執行一次):
    • 載入 Parent 類 → 執行 static 區塊 → 輸出「靜態Parent!」
    • 載入 Child 類 → 執行 static 區塊 → 輸出「靜態Child!」
  2. 第一次 new Child() 實例化:
    • 父類非靜態初始化:執行 Parent 的實例初始化塊 {...} → 輸出「I'm your parent!」
    • 父類建構子:Parent() → 輸出「Parent」
    • 子類非靜態初始化:執行 Child 的實例初始化塊 → 輸出「I'm your child!」
    • 子類建構子:Child() → 輸出「Child」
  3. 第二次 new Child() 實例化:重複步驟 2,靜態區塊不再執行。

核心規則總結

  • 靜態區塊/變量:類載入時按聲明順序執行,**僅執行一次**,父類優於子類。
  • 實例初始化塊:每次 new 物件時執行,**在建構子之前**,父類優於子類。
  • 建構子:每次 new 物件時執行,父類建構子(隱式或顯式 super())優於子類建構子。
  • 記憶口訣:靜態→父塊→父構→子塊→子構;多次 new 只跑非靜態部分。

常見陷阱提醒

  • 靜態區塊中不能使用 this、super 或調用非靜態成員。
  • 若父類無無參建構子,子類必須顯式調用 super(...),否則編譯錯誤。
  • 實例初始化塊常用於匿名內部類或統一初始化邏輯,實際開發較少見。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved