[英]Are Java constructors called upon creating a class? “constructor cannot be applied to given types” error when no object has been created
我正在從教程中重建以下代碼。 當我運行 complie時,出現以下錯誤:
Vierbeiner類中的構造函數Vierbeiner不能應用於給定類型; 必需:找到的java.lang.String:無自變量原因:實際和正式自變量列表的長度不同
我的理解是,發生此錯誤是因為父類Vierbeiner的構造函數需要String參數,而沒有構造函數不需要參數。 我不明白的是為什么我沒有創建Hund類的對象而收到此錯誤。 當我沒有創建Hund類的對象時,為什么要調用構造函數? 我所見過的關於此錯誤的每個現有問題都涉及創建子類的對象。
public class Vierbeiner {
public static void main(String[] args){
Vierbeiner hund = new Vierbeiner("Bello");
hund.rennen();
}
String vierbeinerName;
Vierbeiner(String pName) {
vierbeinerName = pName;
}
public void rennen() {
System.out.println(vierbeinerName+" rennt los!");
}
}
class Hund extends Vierbeiner {
}
編輯:為了回應我得到的答案,對我來說仍然不清楚的是為什么以下(情況1)可以毫無問題地進行編譯:
public class Vierbeiner{
public static void main(String[] args){
Vierbeiner hund = new Vierbeiner();
Hund hund2 = new Hund();
// Hund hund3 = new Hund("doggy");
}
String vierbeinerName;
Vierbeiner() {
vierbeinerName = "test";
};
Vierbeiner(String pName){
}
}
class Hund extends Vierbeiner{
};
在其中似乎使用在Vierbeiner類中定義的no參數構造函數創建了Hund對象。
但是,如果我取消注釋以下情況(情況2),則會出現編譯錯誤:
Hund hund3 = new Hund("doggy");
在情況1中,編譯器將在父類Vierbeiner上查找無參數構造函數以創建hund2對象。 在情況2中,我希望編譯器做同樣的事情,那就是去父類Vierbeiner查找一個字符串參數構造函數來創建hund3對象,但是如果不使用“ super”,情況似乎並非如此。我不明白為什么。
您在編譯期間收到錯誤,而不是運行時收到錯誤或異常。
這意味着代碼沒有被執行,因此沒有創建類實例-沒有任何構造函數的調用。
在編譯期間,很容易檢測到您正在擴展的類具有單個字符串參數構造函數,擴展類必須調用該構造函數(以便創建基礎基類)。
請注意,一旦實現了構造函數, 就不能再依賴於基類的自動生成的無參數默認構造函數 -現在必須在派生類中調用基類的參數化構造函數。
由於您的代碼中缺少這種實現,因此會發生您描述的錯誤。
一個簡單的可能解決方案是提供一個默認的構造函數實現,該實現將調用基類的單個參數構造函數:
class Hund extends Vierbeiner{
Hund() {
super("DefaultName");
}
};
代碼的新增功能解決了編譯時錯誤。
一種更實用的方法是確保派生類也具有帶有字符串參數的構造函數,然后可以將其傳遞給基類構造函數:
class Hund extends Vierbeiner{
Hund(String name) {
super(name);
}
};
參考文獻:
您有一個編譯時錯誤。 您需要在派生類中添加構造函數,並使用super
關鍵字調用基本clase構造函數。
class Hund extends Vierbeiner {
public Hund(String pName) {
super(pName);
}
};
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.