有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

带有私有构造函数的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);
    }
}

共 (2) 个答案

  1. # 1 楼答案

    你的Main类的构造函数隐式调用super()。但是由于Foo2类有一个带参数的构造函数,编译器不会为它生成一个无参数的构造函数,因此隐式super()调用无效

    您可以通过删除现有的Foo2构造函数(如您所做的那样)或向Foo2添加第二个(无参数)构造函数,或添加一个super(someIntValue);调用作为Main构造函数的第一条语句来修复此问题

    以下是第三种选择:

    private Main(int initialVal) {
        super(initialVal);
        this.st = initialVal;
    }
    

    当然,在超级类Foo2和子类Main中都有st实例变量是没有意义的

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

    会更有意义

  2. # 2 楼答案

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

    因此,在您的情况下,父类只有一个参数化构造函数,因此它将无法使用super()调用

    所以你必须打电话给super(initialVal)让它工作

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