我有两节课: -
import java.lang.*;
class A {
public A(int number) {
System.out.println("HI I AM INSIDE PARENT CONSTRUCTOR");
}
}
class B extends A {
public static void main(String[] args) {
A obj = new A(10);
}
}
错误: - 默认构造函数未定义隐式超级构造函数A()。必须定义一个显式的构造函数。
答案 0 :(得分:2)
问题是你没有在B
中声明构造函数,因此编译器提供了默认构造函数,实际上如下所示:
B() {
super();
}
由于A
没有构造函数接受零参数,因此无法编译B
。您需要向调用B
的{{1}}添加构造函数,否则您需要向super(int)
添加零参数构造函数。
答案 1 :(得分:2)
<强>原理强>
子类构造函数必须调用父构造函数。
默认情况下,如果您没有声明,则编译器会生成一个无参数构造函数。
重要细节:这个生成的构造函数使用no arg调用来调用父构造函数。
您的案例
你不能在B中声明一个构造函数。
因此,生成了B的默认无arg构造函数:
这个构造函数是:
B(){
super();
}
但它无法调用父构造函数,因为它声明了一个参数:
public A(int number)
因此编译器会发出此错误:
默认构造函数未定义隐式超类构造函数A()。 必须定义一个显式的构造函数。
要解决您的问题,请在子类中声明一个构造函数,该构造函数使用期望的参数显式调用父构造函数:
public B(int number) {
super(number);
}
答案 2 :(得分:0)
你为A提供了自己的构造函数,其参数为int。现在你需要自己添加一个构造函数给B类。
A
答案 3 :(得分:0)
我认为你错过了default constructor
课程中的A
。
有关详细说明,请参阅this answer。
答案 4 :(得分:0)
添加构造函数B(int):
import java.lang.*;
class A {
public A(int number) {
System.out.println("HI I AM INSIDE PARENT CONSTRUCTOR");
}
}
class B extends A {
public B(int number) {
super(number);
}
public static void main(String[] args) {
A obj = new A(10);
}
}
添加:
public B(int number) {
super(number);
}
答案 5 :(得分:0)
如果未在Java中定义构造函数,则会获得隐式默认构造函数。定义构造函数时,默认构造函数不再存在。所以,当你有类似的东西时:
Class A {
}
这相当于:
Class A {
A() {
super();
}
}
在你的情况下,B类正在调用A的默认构造函数,但由于A已经定义了另一个构造函数,因此默认构造函数不再存在,除非您明确定义它。
答案 6 :(得分:0)
因为你已经在父类中定义了一个带有参数的构造函数,所以编译器不会在没有参数的情况下调用默认构造函数。为了在子类初始化之前实例化父类,你必须调用父类的显式子类中的构造函数。