[英]Overriding method that has no access modifier with protected access modifier
覆盖方法时,不允许降低继承方法的可见性。 根据下表, protected
比no 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节)必须至少提供与重写或隐藏方法一样多的访问权限,如下所示:
- 如果被覆盖或隐藏的方法是公共的,则覆盖或隐藏方法必须是公共的; 否则,发生编译时错误。
- 如果被覆盖或隐藏的方法受到保护,则覆盖或隐藏方法必须受到保护或公开; 否则,发生编译时错误。
- 如果重写或隐藏方法具有默认(包)访问权限,则覆盖或隐藏方法不得为私有方法; 否则,发生编译时错误。
接口中的方法默认为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.