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

Posted

技术标签:

【中文标题】使用受保护的访问修饰符覆盖没有访问修饰符的方法【英文标题】:Overriding method that has no access modifier with protected access modifier 【发布时间】:2015-11-27 11:45:49 【问题描述】:

当你重写方法时,你不能降低继承方法的可见性。根据下表,protectedno modifier 更易访问:

|班级 |包装 |子类 |世界 ————————————+——————+—————————+————————————+———————— 公共 |是 |是 |是 |是的 ————————————+——————+—————————+————————————+———————— 受保护 |是 |是 |是 | n ————————————+——————+—————————+————————————+———————— 没有修饰符 |是 |是 | n | n ————————————+——————+—————————+————————————+———————— 私人 |是 | n | n | n y:可访问 n: 不可访问

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

无法降低从 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()  

【问题讨论】:

您不会覆盖接口方法。你实现它们。 @T.J.Crowder - jls jargon - 在类 C 中声明的实例方法 mC,覆盖 在超接口中声明的另一个方法 mI,如果 ... @bayu.io:有趣,我从没听说过这样说。 【参考方案1】:

来自 Java doc:

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

    如果被覆盖或隐藏的方法是公共的,那么覆盖或隐藏的方法必须是公共的;否则,编译时错误 发生。 如果被覆盖或隐藏的方法被保护,那么覆盖或隐藏的方法必须被保护或公开;否则,一个 发生编译时错误。 如果被覆盖或隐藏的方法具有默认(包)访问权限,则覆盖或隐藏方法不能是私有的;否则,一个 发生编译时错误。

接口中的方法默认为public。所以你不能使用public以外的任何修饰符覆盖/隐藏这个方法。

【讨论】:

【参考方案2】:

接口方法与 public

一起诞生

protected void f(); 

或者

private void f();

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

【讨论】:

【参考方案3】:

在java接口中, 所有方法都是公开的。 所有变量都是 public static final.(constants)

【讨论】:

【参考方案4】:

在 Java 的学习者范围内,这是一个很好的问题。但是您必须记住,有默认和隐式访问修饰符,例如在这种情况下,接口隐式为public 默认情况下

public interface MyInterface 
  void f();

public interface MyInterface 
  public void f();
 

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

【讨论】:

【参考方案5】:

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

【讨论】:

@T.J.Crowder 这有点吹毛求疵,因为你在实现它们时仍然使用@Override @Amila 这仅适用于接口还是有其他没有修饰符 = public 的情况? @Dongo 据我所知仅在接口中 @ajb:你呢?哦,嘿,看,从 Java 1.6 开始(所以,几年前),你做到了:bugs.java.com/bugdatabase/view_bug.do?bug_id=5008260 @Amila:为了清楚起见,我指的是问题而不是您的答案。 (事实上​​,我在你添加第二句话之前写了那条评论。)根本没有批评的意思。 :-)【参考方案6】:

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

【讨论】:

以上是关于使用受保护的访问修饰符覆盖没有访问修饰符的方法的主要内容,如果未能解决你的问题,请参考以下文章

没有访问修饰符的字段,java [重复]

Java 访问权限修饰符以及protected修饰符的理解

java 访问修饰符

02.访问修饰符

受保护和没有访问修饰符之间的区别[关闭]

面试题解五 访问修饰符的区别