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) 明確了初始化的順序如下:
- 執行靜態變數初始化器和靜態初始化區塊。
- 建構函式中的 super() 呼叫(如果存在)。
- 實例變數初始值設定項和實例初始化區塊以文字形式執行order.
- 建構子的剩餘主體,包括 super() 之後的任何程式碼。
因此,在提供的程式碼中,實例變數 'b' 和 'y' 被初始化在執行「X」和「Z」的建構子主體之前,導致輸出「YYXZ」。
以上是Java 中字段初始化和建構函數執行的實際順序是什麼?的詳細內容。更多資訊請關注PHP中文網其他相關文章!
陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章
R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
1 個月前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
1 個月前By尊渡假赌尊渡假赌尊渡假赌
刺客信條陰影:貝殼謎語解決方案
3 週前ByDDD
Windows 11 KB5054979中的新功能以及如何解決更新問題
2 週前ByDDD
威爾R.E.P.O.有交叉遊戲嗎?
1 個月前By尊渡假赌尊渡假赌尊渡假赌

熱工具

WebStorm Mac版
好用的JavaScript開發工具

SublimeText3 Linux新版
SublimeText3 Linux最新版

Atom編輯器mac版下載
最受歡迎的的開源編輯器

SublimeText3 英文版
推薦:為Win版本,支援程式碼提示!

SAP NetWeaver Server Adapter for Eclipse
將Eclipse與SAP NetWeaver應用伺服器整合。