具有私有(private)构造函数的 Java 子类会产生编译错误

标签 java constructor subclass

你能帮我理解为什么下面的代码会出现编译错误吗? 如果我删除 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;
}

当然,在父类(super class) Foo2 和子类 Main 中都拥有 st 实例变量是没有意义的>.

private Main(int initialVal) {
    super(initialVal);
}

会更有意义。

关于具有私有(private)构造函数的 Java 子类会产生编译错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60166205/

相关文章:

c++ - [错误]请求的 'area'中属于非类类型 'r'的 'float'成员意味着什么?

java - 数据抽象和封装

python - 向 datetime.datetime 添加属性

java - 为什么 Hibernate Open Session in View 被认为是不好的做法?

java - 使用 Joda 的 DateTimeFormatter 解析时如何忽略时区?

java - 与构造函数和子类混淆

python - Django 继承和永久链接

java - 是否指定 @Transactional rollbackFor 还包括 RuntimeException

java - 如何更改日期的 json 字符串并将其格式化为仅显示日期而不显示年、月或时间

ios - QLPreviewController自定义导航栏标题颜色?