繁体   English   中英

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

[英]Overriding method that has no access modifier with protected access modifier

覆盖方法时,不允许降低继承方法的可见性。 根据下表, 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() { }
}

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

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

来自Java doc

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

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

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

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

public interface MyInterface {
  void f();
}

public interface MyInterface {
  public void f();
} 

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

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

接口方法与公众一起诞生

protected void f(); 

要么

private void f();

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM