簡體   English   中英

Java 中的構造函數鏈接,何時調用 super?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM