[英]Constructor chaining in Java, when is super called?
如果你有一個調用 this() 的構造函數,什么時候調用 super() ? 在第一個構造函數中調用? 或者在最后一個沒有關鍵字 this() 的構造函數中?
主要調用:new B()
public class A {
public A(){
System.out.print("A ");
}
}
public class B extends A {
public B(){
// is super called here? Option 1
this(1);
System.out.print("B0 ");
}
public B(int i){
// or is super called here? Option 2
System.out.print("B1 ");
}
}
在此示例中,Output 為:“A B1 B0”。 但我不清楚,如果在選項 1 或選項 2 調用 super() 構造函數(因為 Output 在這種情況下是相同的)。
您可以按照以下簡單規則推斷出答案:
只會調用一個超級構造函數,而且只會調用一次。
因此,不可能從B()
調用超級構造函數,因為它將再次從B(int)
調用。
具體來說,在 Java 語言規范 (JLS) 第8.8.7 節中。 《構造體》我們讀到:
如果構造函數體不以顯式構造函數調用開始,並且聲明的構造函數不是原始 class Object 的一部分,則構造函數體隱式以超類構造函數調用“super();”開始,調用構造函數它的直接超類不帶 arguments。
換句話說,如果構造函數主體確實以顯式構造函數調用開始,那么將不會有隱式超類構造函數調用。
(當 JLS 談到以“顯式構造函數調用”開頭的構造函數體時,它意味着調用同一個 class的另一個構造函數。)
當使用new B()
實例化一個新的 object 時,它會自動調用無參數構造函數。 在您的情況下, public B()
。
在無參數構造函數中:因為您的構造函數指定了對另一個構造函數的調用(使用this()
)或手動指定的對超類構造函數的調用(使用super()
),所以沒有對另一個構造函數的其他調用。 如果你的構造函數只有打印行( System.out.print("B0);
), super()
會被自動調用。現在,你正在調用this(1)
,所以你的第一個構造函數不會output 任何東西,但將 go 給你的第二個構造函數,有一個int
參數。
在第二個構造函數中(帶有 int 參數):正如我已經指定的那樣,如果您的構造函數沒有顯式調用this()
或super()
,它會自動調用super()
(沒有任何 arguments 除非手動指定)。 因為super()
必須始終是構造函數中的第一個調用,所以它在您的print
之前執行,這意味着A()
被調用。 首先要打印的是A
。 繼續前進,將打印B1
。
回到你的第一個構造函數(沒有參數): this(1)
已經被調用,所以它移動到下一個語句,打印一些東西的語句。 所以B0
將被打印出來。
現在,作為一個正確答案的回顧: super()
僅在public B(int i)
中自動調用,因為您已經在第一個構造函數中指定了對this()
的調用,而super()
僅在以下情況下自動調用您沒有指定this()
或對super()
的顯式調用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.