覆盖没有具有受保护访问修饰符的访问修饰符的方法

时间:2015-09-02 05:22:06

标签: java override access-modifiers

覆盖方法时,不允许降低继承方法的可见性。根据下表,protectedno modifier更容易访问:

            | Class | Package | Subclass | World
————————————+———————+—————————+——————————+———————
public      |  y    |    y    |    y     |   y
————————————+———————+—————————+——————————+———————
protected   |  y    |    y    |    y     |   n
————————————+———————+—————————+——————————+———————
no modifier |  y    |    y    |    n     |   n
————————————+———————+—————————+——————————+———————
private     |  y    |    n    |    n     |   n

y: accessible
n: not accessible

但是当我尝试覆盖f()(参见SubClass)时,我得到错误:

无法降低MyInterface中继承方法的可见性。

MyInterface中的方法没有访问修饰符,SubClass中的方法受到保护,因此更易于访问。我在这里缺少什么?

public interface MyInterface {
  void f();
}

public abstract class MyClass {
  protected abstract void f();
}

public class SubClass extends MyClass implements MyInterface{
   protected void f() { }
}

6 个答案:

答案 0 :(得分:13)

接口implicitly中的方法具有public的访问修饰符。因此,当您使用protected实现它时,它是一个较弱的访问修饰符。

答案 1 :(得分:3)

接口中的方法隐式标记为public而不是default

答案 2 :(得分:1)

来自Java doc

  

覆盖或隐藏方法的访问修饰符(第6.6节)必须   提供至少与被覆盖或隐藏方法一样多的访问权限   如下:

     
      
  1. 如果被覆盖或隐藏的方法是公开的,那么覆盖或隐藏方法必须是公开的;否则,编译时错误   发生。
  2.   
  3. 如果被覆盖或隐藏的方法受到保护,则必须保护或隐藏覆盖或隐藏方法;否则,a   发生编译时错误。
  4.   
  5. 如果被覆盖或隐藏的方法具有默认(包)访问权限,则覆盖或隐藏方法不得为私有方法;否则,a   发生编译时错误。
  6.   

接口中的方法默认为public。因此,您不能使用public以外的任何修饰符覆盖/隐藏此方法。

答案 3 :(得分:0)

在java中的学习者规模上,这是一个很好的问题。但你必须记住,有默认和隐式访问修饰符,比如在这种情况下的接口,默认情况下隐式public

public interface MyInterface {
  void f();
}

public interface MyInterface {
  public void f();
} 

两者都是隐含的。接口的设计方式使其行为公开。

答案 4 :(得分:0)

在java界面中, 所有的方法都是公开的。 所有变量都是public static final。(常量)

答案 5 :(得分:0)

接口方法诞生于 public

protected void f(); 

private void f();

在MyInterface中,看看你得到了什么。