一尘不染

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

java

我有一些简单的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

我想做的事可能吗?


阅读 911

收藏
2020-03-03

共1个答案

一尘不染

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

public ACSubClass() {
    super();
}

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

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

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

2020-03-03