带有私有构造函数的Java子类产生编译错误
你能帮我理解为什么下面的代码给出编译错误吗? 如果我删除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);
}
}
# 1 楼答案
你的
Main
类的构造函数隐式调用super()
。但是由于Foo2
类有一个带参数的构造函数,编译器不会为它生成一个无参数的构造函数,因此隐式super()
调用无效您可以通过删除现有的
Foo2
构造函数(如您所做的那样)或向Foo2
添加第二个(无参数)构造函数,或添加一个super(someIntValue);
调用作为Main
构造函数的第一条语句来修复此问题以下是第三种选择:
当然,在超级类
Foo2
和子类Main
中都有st
实例变量是没有意义的会更有意义
# 2 楼答案
默认情况下,如果尚未添加
super()
,编译器将在子类构造函数中添加super()
因此,在您的情况下,父类只有一个参数化构造函数,因此它将无法使用
super()
调用所以你必须打电话给
super(initialVal)
让它工作如果不添加
super(initialVal)
,则必须创建默认构造函数 在没有参数的父类中,因此可以通过super()
调用它,编译器将添加它