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()方法在自己的方式(template method pattern)。

这工作很好,但我不喜欢在子类中有冗余的构造函数。它是更多的类型,它是很难维护。如果我改变了BaseClass构造函数的方法签名,我将改变所有的子类。

当我从子类中删除构造函数时,我得到这个编译时错误:

隐式超级构造函数BaseClass()未定义为默认构造函数。必须定义一个显式构造函数

是我想要做的可能吗?

最佳答案
你得到这个错误,因为没有构造函数的类有一个默认的构造函数,它是无参数的,并且等价于下面的代码:

public ACSubClass() {
    super();
}

然而,由于您的BaseClass声明了一个构造函数(因此没有编译器将提供的默认,无参数构造函数),这是非法的 – 扩展BaseClass的类不能调用super();因为BaseClass中没有无参数构造函数。

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

最简单的方法是基类不声明一个构造函数(因此具有默认的,无参数的构造函数),或者有一个声明的无参数的构造函数(无论是单独的还是任何其他构造函数)。但通常这种方法不能应用 – 因为你需要传递到构造函数中的任何参数来构造类的合法实例。

转载注明原文:Java错误:隐式超级构造函数未定义为默认构造函数 - 代码日志