Java 中的构造函数是否有访问修饰符继承?

Is there access modifier inheritance for constructors in Java?

在 Java 中扩展 class 时,我可以提供覆盖更高或相等访问修饰符的方法,但不能提供更低的访问修饰符。不允许以下内容,因为 ClassB 中的方法 foo 必须是 public:

public class ClassA {
    public void foo() {}
}
public class ClassB extends ClassA {
    @Override
    protected void foo() {}
}

这似乎不适用于构造函数。我可以做到以下几点:

public class ClassA {
    public ClassA () {}
}
public class ClassB extends ClassA {
    protected ClassB() {}
}

为什么会这样?是否有其他规则也适用于构造函数但不适用于方法?

因为ClassB的构造函数没有overrideClassA的构造函数。这是一个完全不同的方法,只调用(显式或隐式)ClassA 的构造函数。所以能见度也会降低。

另一个测试点是,如果你自己不调用很多ClassA的构造函数,就会调用ClassA的默认构造函数。如果 ClassA 没有,而你又不在 ClassB 的构造函数中调用另一个,编译器会不高兴。

// This WILL call super() implicitly, without you actually having to write it
protected ClassB() {}

我假设您已经知道如果您根本不为 class 编写任何构造函数,默认构造函数将被隐式添加。 (此默认构造函数将再次简单地调用 super(),见上文)。