您能帮我理解为什么以下代码会导致编译错误吗?
如果删除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);
}


会更有意义。

10-07 13:11