Mat*_*der 1 java inheritance constructor access-modifiers
在Java中扩展类时,我可以给出覆盖更高或更高访问修饰符的方法,但不能更低.以下是不允许的,因为方法foo中ClassB必须是public:
public class ClassA {
public void foo() {}
}
public class ClassB extends ClassA {
@Override
protected void foo() {}
}
Run Code Online (Sandbox Code Playgroud)
似乎这不适用于构造函数.我可以做以下事情:
public class ClassA {
public ClassA () {}
}
public class ClassB extends ClassA {
protected ClassB() {}
}
Run Code Online (Sandbox Code Playgroud)
为什么会这样?是否有其他规则也适用于构造函数但不适用于方法?
因为ClassB override的构造函数不是ClassA的构造函数.它是一种完全不同的方法,只调用(显式或隐式)ClassA的构造函数.因此,可见度也可以降低.
另一个强调点是,如果你没有自己调用ClassA的许多构造函数,那么将调用ClassA的默认构造函数.如果ClassA没有,并且你没有在ClassB的构造函数中调用另一个,编译器将不满意.
// This WILL call super() implicitly, without you actually having to write it
protected ClassB() {}
Run Code Online (Sandbox Code Playgroud)
我假设您已经知道如果您根本没有为您的类编写任何构造函数,则将隐式添加默认构造函数.(这个默认构造函数将再次调用super(),参见上文).