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

Java中是否存在构造函数的访问修饰符继承?,java,inheritance,constructor,access-modifiers,Java,Inheritance,Constructor,Access Modifiers,在Java中扩展类时,我可以提供覆盖更高或更平等访问修饰符的方法,但不能覆盖更低的访问修饰符。由于ClassB中的方法foo必须是public,因此不允许出现以下情况: public class ClassA { public void foo() {} } public class ClassB extends ClassA { @Override protected void foo() {} } 这似乎不适用于构造函数。我可以做到以下几点: public clas

在Java中扩展类时,我可以提供覆盖更高或更平等访问修饰符的方法,但不能覆盖更低的访问修饰符。由于
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的构造函数不覆盖ClassA的构造函数。它是一个完全不同的方法,只调用(显式或隐式)ClassA的构造函数。所以能见度也可以降低

另一个要点是,如果您自己没有调用ClassA的许多构造函数,则会调用ClassA的默认构造函数。如果ClassA没有一个,并且您没有在ClassB的构造函数中调用另一个,编译器将不高兴

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

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

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

另一个要点是,如果您自己没有调用ClassA的许多构造函数,则会调用ClassA的默认构造函数。如果ClassA没有一个,并且您没有在ClassB的构造函数中调用另一个,编译器将不高兴

// This WILL call super() implicitly, without you actually having to write it
protected ClassB() {}
我假设您已经知道,如果您根本不为类编写任何构造函数,那么默认构造函数将被隐式添加。(此默认构造函数将再次调用
super()
,请参见上文)