簡體   English   中英

創建類時會調用Java構造函數嗎? 未創建對象時出現“無法將構造函數應用於給定類型”錯誤

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

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