带有私有构造函数的Java子类产生编译错误

问题描述 投票:0回答:2

您能帮我理解为什么以下代码会导致编译错误吗?如果我删除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);
    }
}
java constructor subclass
2个回答
0
投票

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);
}

会更有意义。


0
投票

默认情况下,如果尚未添加,编译器将在子类构造函数中添加super()

因此,在您的情况下,父类具有单个参数化构造函数,因此将无法使用super()进行调用>

所以您必须致电super(initialVal)使其生效

如果不添加super(initialVal),则必须创建默认构造函数在不带参数的父类中,因此可以通过super()进行调用,该编译器将添加它

© www.soinside.com 2019 - 2024. All rights reserved.