繁体   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