Java构造函数是否需要创建一个类?没有创建对象时,"构造函数不能应用于给定类型"错误

Ron*_*ald 0 java constructor compiler-errors class object

我正在从教程中重构以下代码.当我运行 complie时,我收到以下错误:

类Vierbeiner中的构造函数Vierbeiner不能应用于给定类型; required:java.lang.String found:无参数原因:实际和形式参数列表的长度不同

我的理解是发生此错误是因为父类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 {
}
Run Code Online (Sandbox Code Playgroud)

编辑:在回答我已经得到的答案时,我仍然不清楚为什么以下(案例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{

};
Run Code Online (Sandbox Code Playgroud)

我在其中创建了一个Hund对象,似乎使用了我在Vierbeiner类中定义的无参数构造函数.

但是如果我取消注释以下内容(案例2),我会收到编译错误:

Hund hund3 = new Hund("doggy");
Run Code Online (Sandbox Code Playgroud)

在案例1中,编译器查找父类Vierbeiner以查找无参数构造函数以创建hund2对象.在第2种情况下,我希望编译器做同样的事情,那就是去父类Vierbeiner找到一个字符串参数构造函数来创建hund3对象,但是如果不使用"super"就不会出现这种情况.我不明白为什么.

Ran*_*itz 5

您在编译期间收到错误,而不是运行时的错误或异常.

这意味着代码没有被执行,因此没有创建类实例 - 没有任何构造函数的调用.

在编译期间,很容易检测到您正在扩展一个具有单个字符串参数构造函数的类,扩展类必须调用该类(为了创建底层基类).

请注意,一旦实现了构造函数,就不能再依赖基类的自动生成的无参数默认构造函数 - 现在必须在派生类中调用基类的参数化构造函数.

由于您的代码中缺少此类实现 - 您所描述的错误会发生.

一个简单的可能解决方案是提供一个默认的构造函数实现,它将调用基类的单个参数构造函数:

class Hund extends Vierbeiner{
    Hund() {
        super("DefaultName");
    }    

};
Run Code Online (Sandbox Code Playgroud)

对代码的这一添加解决了编译时错误.

更实用的方法是确保派生类具有带字符串参数的构造函数,然后可以将其传递给基类构造函数:

class Hund extends Vierbeiner{
    Hund(String name) {
        super(name);
    }    

};
Run Code Online (Sandbox Code Playgroud)

参考文献: