当前位置: 首页 > 知识库问答 >
问题:

创建类时是否调用Java构造函数?未创建对象时出现“构造函数无法应用于给定类型”错误

微生慈
2023-03-14

我正在从一个教程中重构下面的代码。当我< s >运行编译它时,我得到以下错误:

Vierbeiner类中的构造函数Vierbeiner不能应用于给定类型;必需:java.lang.找到字符串:无参数原因:实际参数列表和正式参数列表长度不同

我的理解是,发生这个错误是因为父类Vierbeiner有一个需要字符串参数的构造函数,而没有一个不需要参数的构造函数。我不明白的是,为什么我在没有创建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{

};

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

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

Hund hund3 = new Hund("doggy");

在情况 1 中,编译器查找父类 Vierbeiner 以查找创建 hund2 对象的无参数构造函数。在情况 2 中,我希望编译器做同样的事情,即转到父类 Vierbeiner 找到一个字符串参数构造函数来创建 hund3 对象,但如果不使用“super”,情况似乎并非如此,我不明白为什么。

共有2个答案

郑嘉年
2023-03-14

您有一个编译时错误。您需要在派生类中添加构造函数,使用<code>super</code>关键字调用基类构造函数。

class Hund extends Vierbeiner {

    public Hund(String pName) {
        super(pName);
    }

};
酆翔宇
2023-03-14

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

这意味着代码没有被执行,所以没有创建类实例 - 没有调用任何构造函数。

在编译期间,很容易发现您正在扩展一个具有单个字符串参数构造函数的类,扩展类必须调用该构造函数(以便创建底层基类)。

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

因为您的代码中缺少这种实现,所以会出现您所描述的错误。

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

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

};

对代码的此添加解决了编译时错误。

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

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

};

参考资料:

    < li>Java编译器定义 < li>Java编译时间与运行时错误 < li>Java常见编译时错误 < li >在Java中从派生类调用基类构造函数 < li>Java规范-默认构造函数
 类似资料:
  • 我有一个主类,DataManager,它有一个子类FileHandler,它扩展了DataManager。 另一类: 我遇到了一个错误,指出构造函数不能应用于给定类型。这是我第一次在Java中使用继承,这个问题对我来说并没有太大帮助。 下面是我从NetBeans获得的更具体的版本... “DataManager类中的构造函数DataManager不能应用于给定类型;必需:找到文件:无参数原因:实际

  • 问题内容: 在Java中,数组是AN对象。我的问题是…创建新数组时是否调用了Object构造函数?我们希望利用这一事实来为Object构造函数提供一些额外的字节码,以检查所构造数组的长度。那行得通吗? 问题答案: 就Java语言规范而言,尽管它们都使用关键字,但类实例创建表达式和数组创建表达式是不同的表达式形式,每种都有自己的规则。数组创建表达式的描述未提及调用构造函数。

  • 问题内容: 当我们创建扩展抽象类的Subclass对象时,抽象类构造函数也会运行。但是我们知道我们不能创建抽象类的对象。因此,这是否意味着即使构造函数无任何例外地完成运行,也不能保证是否创建了对象吗? 问题答案: 因此,这是否意味着即使构造函数无任何例外地完成运行,也不能保证是否创建了对象吗? 简而言之,a 不会创建对象。它只是 初始化 对象的 状态 。创建对象的是操作员。现在,让我们详细了解一下

  • 在问我的问题之前,我想把一些事情说清楚。首先,我是Java和编程的新手。第二,这是我的第一个帖子,所以如果我做错了什么,请宽容对待我。最后,我不想要任何具体的解决办法,我的任务在任何回应这篇文章。这些问题要我来解决。我想要的是一个解释,为什么我的测试代码不能编译/运行。为了更好地理解这个问题,我将粘贴赋值信息,然后是给定的驱动程序类,然后是驱动程序类访问的我的类代码。我的编译器错误显示在标题中,但

  • 我在创建对象和参数化构造函数时遇到以下错误。 Main.java: 6:错误:构造函数Cipher类中的Cipher不能应用于给定类型 必需:无参数 找到:int 原因:实际参数列表和正式参数列表的长度不同 这是我的文件的样子

  • 我在弄清楚如何根据给定的类型在构造函数中创建一个新对象时遇到了困难。 例如,我有一个机器人驱动程序,它有一个默认构造函数,不接受任何参数,并创建一个基本的机器人。但我有另一个构造器,根据这个论点创造了一个新的机器人。 是一个接口。那么,如果我想创建,使其是另一种类型,比如?我需要做一些类型的铸造吗?