首頁 > Java > java教程 > Java 中字段初始化和建構函數執行的實際順序是什麼?

Java 中字段初始化和建構函數執行的實際順序是什麼?

Mary-Kate Olsen
發布: 2024-12-11 15:00:19
原創
482 人瀏覽過

What's the Actual Order of Field Initialization and Constructor Execution in Java?

Java 建構函式中的欄位初始化

在Java 中,欄位初始化和建構函式程式碼的執行順序一直是個令人困惑的話題。提供的程式碼示範了這種行為:

class X {
    Y b = new Y();

    X() {
        System.out.print("X");
    }
}

class Y {
    Y() {
        System.out.print("Y");
    }
}

public class Z extends X {
    Y y = new Y();

    Z() {
        System.out.print("Z");
    }

    public static void main(String[] args) {
        new Z();
    }
}
登入後複製

基於建構函式在實例變數之前初始化的假設,人們可能會期望輸出為「XZYY」。然而,實際輸出是「YYXZ」:

  • Y():呼叫類別 Y 的建構子。
  • new Y():類別 X 中的實例變數「b」透過建立一個新實例來初始化'Y'。
  • X(): 呼叫類別 X 的建構子。
  • new Y(): 中的實例變數 'y'類別 Z 透過建立一個新實例來初始化'Y'。
  • Z():呼叫類別 Z 的建構子。

此輸出與預期順序相矛盾,因為字段初始化(例如,'b ' 和'y')發生在構造函數體執行之前(例如,'X()' 和'Z( )')。

Java 虛擬機器規格 (JVM Spec) 明確了初始化的順序如下:

  1. 執行靜態變數初始化器和靜態初始化區塊。
  2. 建構函式中的 super() 呼叫(如果存在)。
  3. 實例變數初始值設定項和實例初始化區塊以文字形式執行order.
  4. 建構子的剩餘主體,包括 super() 之後的任何程式碼。

因此,在提供的程式碼中,實例變數 'b' 和 'y' 被初始化在執行「X」和「Z」的建構子主體之前,導致輸出「YYXZ」。

以上是Java 中字段初始化和建構函數執行的實際順序是什麼?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板