您能帮我理解为什么以下代码会导致编译错误吗?
如果删除Foo2的构造函数,它将正常工作。
class Foo2 {
int st;
protected Foo2(int initialVal) {
this.st = initialVal;
}
}
public class Main extends Foo2 {
int st;
private Main(int initialVal) {
this.st = initialVal;
}
public static void main(String args[]) {
Foo2 f = new Main(2);
}
}
最佳答案
Main
类的构造函数隐式调用super()
。但是,由于您的Foo2
类具有带有参数的构造函数,因此编译器不会为其生成没有参数的构造函数,因此隐式super()
调用无效。
您可以通过删除现有的Foo2
构造函数(如您所做的)或向Foo2
添加第二个(无参数)构造函数或将super(someIntValue);
调用作为Main
构造函数的第一条语句来解决此问题。
这是第三个选择:
private Main(int initialVal) {
super(initialVal);
this.st = initialVal;
}
当然,在超类
st
和子类Foo2
中都没有Main
实例变量是没有意义的。private Main(int initialVal) {
super(initialVal);
}
会更有意义。