当前位置: 首页 > 面试题库 >

Java错误:未为默认构造函数定义隐式超级构造函数

淳于烈
2023-03-14
问题内容

我有一些简单的Java代码,其结构与此类似:

abstract public class BaseClass {
    String someString;
    public BaseClass(String someString) {
        this.someString = someString;
    }
    abstract public String getName();
}

public class ACSubClass extends BaseClass {
    public ASubClass(String someString) {
        super(someString);
    }
    public String getName() {
        return "name value for ASubClass";
    }
}

我将有很多的子类BaseClass,每个子类以getName()自己的方式(模板方法模式)实现方法。

这很好用,但是我不喜欢子类中有多余的构造函数。输入更多,难以维护。如果要更改BaseClass构造函数的方法签名,则必须更改所有子类。

当我从子类中删除构造函数时,出现此编译时错误:

Implicit super constructor BaseClass() is undefined for default constructor. Must define an explicit constructor

我想做的事可能吗?


问题答案:

你会收到此错误,因为没有构造函数的类具有默认构造函数,该构造函数没有参数,并且等效于以下代码:

public ACSubClass() {
    super();
}

但是,由于你的BaseClass声明了一个构造函数(因此没有默认值,否则将由编译器提供no-arg构造函数),这是非法的-扩展BaseClass的类无法调用super();因为没有无参数的构造函数在BaseClass中。

这可能有点违反直觉,因为你可能认为子类自动具有基类所具有的任何构造函数。

解决此问题的最简单方法是,基类不声明构造函数(因此具有默认的no-arg构造函数)或具有声明的no-arg构造函数(无论是单独使用还是与任何其他构造函数一起使用)。但是通常无法应用这种方法-因为你需要将任何参数传递到构造函数中,以构造类的合法实例。



 类似资料:
  • 问题内容: 我是Java的新手,只是学习OOP概念。请检查我的代码。我收到以下错误。- 隐式超级构造函数未定义。 问题答案: 您收到此错误,因为BoxSuper没有no-arg构造函数。在BoxSub中的构造函数调用期间,如果未定义超级构造函数调用,Java会尝试自动调用no- arg super()构造函数。 在BoxSuper中定义超级构造函数调用,如下所示: 或在BoxSuper中定义无参数

  • 问题内容: 默认构造函数到底是什么?你能告诉我以下哪个是默认构造函数,它与其他构造函数有何不同? 问题答案: 他们都不是。如果定义,则不是默认值。 除非你定义另一个构造函数,否则默认构造函数是自动生成的无参数构造函数。任何未初始化的字段都将设置为其默认值。对于你的榜样,它看起来像这样假设的类型String,int以及int,那类本身是公共的: 这与 完全没有构造函数。但是,如果定义至少一个构造函数

  • 我有一个记录,想添加默认构造函数。 但是它创建了带有参数的构造函数。 我们如何将默认构造函数添加到记录中?

  • 问题内容: 好的,我正在做学校的作业,我设置了我的主班和另一个名为“交易”的班。在我的主班我有: 带下划线的交易:表示构造函数未定义。为什么?! Transaction类如下所示: 看起来它应该可以工作,但事实并非如此。即使当我在main中创建新Transaction对象的位置插入一堆变量时,它仍然显示未定义。有人请帮忙! 问题答案: 您的类中没有默认的构造函数定义。 当您提供至少一个参数化构造函

  • 在.citydoor.imports.catalog.tools中打包;

  • 为什么: 如果一个类不提供任何然后在编译时由编译器给出,但是如果一个类包含,那么默认构造函数不是由编译器提供。 我正在编译下面的代码。它给出了编译错误。 代码: 控制台错误: 当我只调用。工作正常。但是当您想使用参数化构造函数调用