如果方法foo()
作为protected
存在于基类中,如果在子类中我们使用public
描述符定义方法会发生什么?
答案 0 :(得分:1)
可以使更多可访问。来自Java语言规范section 8.4.8.3:
覆盖或隐藏方法的访问修饰符(第6.6节)必须至少提供与重写或隐藏方法一样多的访问权限,否则会发生编译时错误。更详细:
- 如果被覆盖或隐藏的方法是公开的,那么覆盖或隐藏方法必须是公开的;否则,发生编译时错误。
- 如果被覆盖或隐藏的方法受到保护,则必须保护或隐藏覆盖或隐藏方法;否则,发生编译时错误。
- 如果被覆盖或隐藏的方法具有默认(包)访问权限,则覆盖或隐藏方法不得为私有方法;否则,发生编译时错误。
答案 1 :(得分:1)
如果重写的方法具有更宽松的权限(例如public而不是protected),则该子类的任何引用都将具有覆盖权限的方法。如果overriden方法具有更严格的权限,那就是编译错误。
请参阅底部附近的JLS 8.4.8.3(“覆盖或隐藏方法的访问修饰符(第6.6节)必须至少提供与重写或隐藏方法一样多的访问权限,否则会发生编译时错误” )。
答案 2 :(得分:0)
如果通过更改访问描述符来增加方法的访问权限,那么就没有问题,但是你不能减少子类中任何方法的访问权。
class A{
protected void foo(){
}
}
class B1 extends A{
public void foo(){
}
}
class B2 extends A{
private void foo(){
}
}
class Example{
public void ex(){
A b1 = new B1();
A b2 = new B2();
b1.foo();
b2.foo();
}
}
b1.foo()不会产生任何问题,但如果我们在编译时允许b2.foo(),它将在运行时失败。因为java永远不允许用户在覆盖方法时减少对任何方法的访问