Java中是否存在构造函数的访问修饰符继承?
在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
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()
,请参见上文)