這似乎是相當的混淆的問題。根據定義,我知道構造函數是一種特殊類型的方法,用於初始化對象的狀態和/或爲實例變量賦值。如果構造函數沒有任何返回類型,它將如何返回?
也有人在堆棧溢出提到,構造函數返回一個類的,而不是正常的方法做/返回?
儘管經歷了很多教程和參考資料,但我無法找到一個具體的原因,就如何在不存在return語句的情況下構造函數能夠返回值。
我很想知道整個過程的內部工作。
這似乎是相當的混淆的問題。根據定義,我知道構造函數是一種特殊類型的方法,用於初始化對象的狀態和/或爲實例變量賦值。如果構造函數沒有任何返回類型,它將如何返回?
也有人在堆棧溢出提到,構造函數返回一個類的,而不是正常的方法做/返回?
儘管經歷了很多教程和參考資料,但我無法找到一個具體的原因,就如何在不存在return語句的情況下構造函數能夠返回值。
我很想知道整個過程的內部工作。
構造函數不返回任何東西。構造函數只是初始化一個實例。
甲new instance creation expression
new SomeExample();
產生將指定的類
的新實例的引用一類新的實例被顯式地創建當一個類 實例創建表達的評價(§15.9)導致類實例化爲 。
,並調用相應的構造函數初始化該創建的實例
到新創建的對象的引用被返回作爲 結果只要前,所指示的構造被處理使用來初始化新 對象以下過程:
將構造函數的參數分配給此構造函數調用的新創建的參數變量。
如果此構造在同一類(使用本)另一個構造的一個明確的構造函數調用(§8.8.7.1)開始,然後 評估該構造函數調用 遞歸使用這些相同的五個步驟的參數和過程。如果構造函數 調用突然完成,則此過程由於相同的原因突然完成 ;否則,繼續執行步驟5
此構造不會在同一個類的另一個構造函數的顯式構造函數調用開始(使用本)。如果 此構造函數用於Object以外的類,則此構造函數將以顯式或隱式調用超類構造函數(使用super)開始。評估參數和 處理該超類的構造函數調用遞歸使用這些 相同的五個步驟。如果該構造函數調用突然完成,則 由於相同的原因,此過程突然完成。否則, 繼續執行步驟4。
執行實例初始化和實例變量初始值設定爲這樣的類,分配實例的可變 初始化的值給相應的實例變量,在 左到右的順序在它們文本地出現在源代碼 爲班級。如果任何這些初始化程序的執行導致 異常,則不會處理進一步的初始化程序,並且此過程會因該同一異常而突然完成。否則, 繼續執行第5步。
執行此構造函數的其餘部分。如果執行突然完成,則此過程突然完成,原因相同。否則,此過程正常完成。
它使JVM的 '迴歸' 的操作碼:
'迴歸' 返回到調用方法: http://en.wikipedia.org/wiki/Java_bytecode_instruction_listings
代碼默認構造函數:
aload_0
invokespecial #1; //Method java/lang/Object
return
Java構造函數不返回任何內容。構造函數只是初始化特定類的對象的新實例。有時構造函數會有System.out.Println(「text」),這可能會導致你認爲它返回了一些東西,但是你可以在任何沒有返回類型的方法中使用該語句。
@magoon - 同意,構造函數不返回任何東西。考慮到這一點,在正常情況下,人們會創建getter&setter方法來檢索值,對嗎?但是,在初始化之後的構造函數的情況下,在場景後面發生的提示代碼顯示輸出的魔法是什麼? – mindfreak
在字節碼
Test1 t1 = new Test1();
如下所示
NEW test/Test1 //create an uninitized instance of Test1
DUP
NVOKESPECIAL test/Test1.<init>()V // call construcctor
STORE 1 // save reference to created instance in local var
,這是構造函數,其實無效方法具有特殊名稱<init>
public <init>()V //V means no return value, void
L0
LINENUMBER 3 L0
ALOAD 0
INVOKESPECIAL java/lang/Object.<init>()V // call super constructor
RETURN
@dorofeev - 與我們在getter-setter方法中返回值相反,我希望知道即使沒有返回語句也會促使構造函數顯示輸出的內部機制? **問題更關注「HOW ASPECT」?** – mindfreak
'new'創建一個對象,在其上運行一個初始化程序(構造函數),然後返回對創建對象的引用 –
@mindfreak「how」概念與兩個事情:內存管理和生成的字節碼。正如Evgeniy在他的回答中所顯示的那樣,生成的字節碼實際上具有返回語句以將控制權釋放給調用者。但是,它並不實際返回新創建的對象本身,而是返回該對象的內存引用。要比這更深入,可能會超出SO的範圍。 – JNYRanger
一個構造函數不返回任何東西。 –
這就是如何設計語言,構造函數「返回」對象本身的一個實例,這是自動完成的 – MadProgrammer
構造函數不像普通方法那樣調用,它使用'new'關鍵字調用。考慮有一個return語句,你甚至會返回什麼,這將是不必要的 –