Java错误:隐式超级构造函数未定义。必须显式调用另一个构造函数

时间:2014-08-08 18:03:53

标签: java

我在外部jar中有一个BaseClass,它有一个构造函数,将实现类(JerseyClientImpl)设置为jerseyClient。

public BaseClass(AuthDetails auth, String ID) {
    setListID(D);
    this.jerseyClient = new JerseyClientImpl(auth);
}

我正在扩展BaseClass以将我自己的Implementation类设置为jerseyClient,但是我收到了提到的错误。更改BaseClass以添加默认构造函数不在我的控制范围内,因为我说它是一个外部jar.Can你建议我如何克服这个错误。

3 个答案:

答案 0 :(得分:1)

由于BaseClass具有非默认构造函数,因此它没有自动生成的无参数默认构造函数。

因此,您的子类不能依赖于默认构造函数(因为它无法调用基类的不存在的默认构造函数),因此您的子类必须具有调用的显式构造函数基类的构造函数。

具有相同参数的构造函数:

public SubClass(AuthDetails auth, String ID) {
    super(auth,ID);
    ...
}

或者没有参数的构造函数为基类的构造函数提供默认值:

public SubClass() {
    super(null,"something");
    ...
}

答案 1 :(得分:1)

在Java中,如果您没有显式提供对超类构造函数的调用作为构造函数中的第一个语句,那么它将插入对默认超类构造函数的隐式调用。如果没有默认的超类构造函数,那么你会得到你提到的错误。

JLS, Section 8.8.7,声明:

  

如果构造函数体不是以显式构造函数调用开始并且声明的构造函数不是原始类Object的一部分,那么构造函数体隐式地以超类构造函数调用开始" super();&# 34;,调用其直接超类的构造函数,不带参数。

您必须显式调用超类构造函数,并传递所有参数,如下所示:

public JerseyClientImpl(AuthDetails auth, String ID) {
    super(auth, ID);

    // Rest of constructor code
}

答案 2 :(得分:1)

首先,如果你在一个类中编写一些参数化构造函数...该类的默认no arg构造函数不再存在。

并且,当您尝试创建其子类的构造函数时,始终首先调用父类的无参数构造函数。如果它不存在,则会出现编译器错误。

因此,在父类中定义no arg构造函数,或者只是在子类构造函数中调用父类的参数化构造函数。