簡體   English   中英

與顯式構造函數調用的混淆

[英]Confusion with explicit constructor invocation

在我為重載的構造函數提供參數的代碼中,該參數調用了no-args構造函數,在這種情況下,該構造函數應調用對象類的構造函數。 因此,使用this()關鍵字如何正確執行程序,而不是直接調用構造函數。

public class S {

    S() {
        System.out.println("S()");
    }

    S(int i) {

        this();
        S();// The method S is undefined for type S
        System.out.println("S(int i)");
    }

    public static void main(String[] args) {
        S obj1 = new S();
        System.out.println("----------");
        S obj2 = new S(10);
        System.out.println("----------");

    }

}

從語法上講, S()是方法調用,但是您沒有名為S的方法。

this(); 是在同一類中使用另一個構造函數的特殊語法。

為了說明這一點,我添加了:

void S() {
  System.out.println("Method S()");
}

現在可以編譯,輸出為:

S()
----------
S()
Method S()
S(int i)
----------

定義了構造函數以初始化(構造)對象,因此無法調用它。

S s = new S();//Correct
S(); //Incorrect, you are calling a method not a constructor.
new S();//Correct
  • this()用於將參數傳遞給同一類的構造函數。
  • super()用於將參數傳遞給父構造函數。

這稱為顯式構造函數調用。

請注意,從另一個構造函數調用一個構造函數時,它必須是該構造函數的第一條語句,否則將無法編譯。

Java語言規范的第8.8.7.1節“顯式構造函數調用”定義了如何調用同一類的其他構造函數:

•備用構造函數調用以關鍵字this(可能以顯式類型參數開頭)開頭。 它們用於調用同一類的備用構造函數。

•超類構造函數的調用以關鍵字super(可能以顯式類型參數開頭)或Primary表達式開始。 它們用於調用直接超類的構造函數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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