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」:
此輸出與預期順序相矛盾,因為字段初始化(例如,'b ' 和'y')發生在構造函數體執行之前(例如,'X()' 和'Z( )')。
Java 虛擬機器規格 (JVM Spec) 明確了初始化的順序如下:
因此,在提供的程式碼中,實例變數 'b' 和 'y' 被初始化在執行「X」和「Z」的建構子主體之前,導致輸出「YYXZ」。
以上是Java 中字段初始化和建構函數執行的實際順序是什麼?的詳細內容。更多資訊請關注PHP中文網其他相關文章!