[英]How does the constructor work while initializing an object?
此代碼的輸出為7 20。
為什么7先打印,然后打印20?
public class Television
{
private int channel = setChannel(7);
public Television(int channel)
{
this.channel = channel;
System.out.print(channel +"");
}
public int setChannel(int channel)
{
this.channel = channel;
System.out.print(channel + "");
return channel;
}
public static void main(String args[])
{
new Television(20);
}
}
創建對象時,將創建其字段。 你有一個班級成員:
private int channel = setChannel(7);
當你這樣做時:
new Television(20);
初始化該字段並在調用構造函數之前調用setChannel
,並從那里打印7。
創建對象的所有字段並使用提供的值填充(如果未指定值,則填充默認值)。 您可以將其視為實例的准備。 准備好並初始化這些成員后,將調用構造函數。
有關更多詳細信息,請參閱JLS 。
答案可以在Java語言規范中找到 :
在作為結果返回對新創建的對象的引用之前,處理指示的構造函數以使用以下過程初始化新對象:
將構造函數的參數分配給此構造函數調用的新創建的參數變量。
如果這個構造函數以同一個類中另一個構造函數的顯式構造函數調用(第8.8.7.1節)開頭(使用它)......
...如果此構造函數用於Object以外的類,則此構造函數將以超類構造函數的顯式或隱式調用開始(使用super)...
為此類執行實例初始值設定項和實例變量初始值設定項 ,將實例變量初始值設定項的值按從左到右的順序分配給相應的實例變量,在這些順序中,它們以文本方式出現在類的源代碼中。 如果執行任何這些初始值設定項導致異常,則不會處理其他初始化程序,並且此過程會突然完成同樣的異常。 否則,繼續步驟5。
執行此構造函數的其余部分 。 如果執行突然完成,則此過程突然完成,原因相同。 否則,此過程正常完成。
總結一下,如果構造函數沒有調用另一個構造函數(使用this
)並且它不調用任何超類構造函數(使用super
),則在執行構造函數的代碼之前初始化實例變量。
首先,初始化私有字段,然后調用構造函數。
所以輸出是7 20。
在java中,實例化一個新對象時發生以下過程:
你在類construsctor之外初始化你的字段'channel',所以在它之前調用這個初始化。
這是你打電話給new Television(20)
時所附加的內容new Television(20)
:
1/this.channel set to 7 (init step)
2/Calling constructor
3/this.chennel set to 20 (constructor code)
因為初始化變量通道的setChannel首先被調用為init類,而構造函數之后的方法被調用。
當您創建對象的實例時,首先創建其數據成員(即首先執行該行的private int channel = setChannel(7);
)然后只有構造函數public Television(int channel) {...}
創建賓語。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.