使用不同的访问描述符标记重写方法时会发生什么?

时间:2012-01-03 06:16:56

标签: java

如果方法foo()作为protected存在于基类中,如果在子类中我们使用public描述符定义方法会发生什么?

3 个答案:

答案 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永远不允许用户在覆盖方法时减少对任何方法的访问