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