覆盖方法时,不允许降低继承方法的可见性。根据下表,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() { }
}
答案 0 :(得分:13)
接口implicitly中的方法具有public
的访问修饰符。因此,当您使用protected
实现它时,它是一个较弱的访问修饰符。
答案 1 :(得分:3)
接口中的方法隐式标记为public
而不是default
答案 2 :(得分:1)
来自Java doc:
覆盖或隐藏方法的访问修饰符(第6.6节)必须 提供至少与被覆盖或隐藏方法一样多的访问权限 如下:
- 如果被覆盖或隐藏的方法是公开的,那么覆盖或隐藏方法必须是公开的;否则,编译时错误 发生。
- 如果被覆盖或隐藏的方法受到保护,则必须保护或隐藏覆盖或隐藏方法;否则,a 发生编译时错误。
- 如果被覆盖或隐藏的方法具有默认(包)访问权限,则覆盖或隐藏方法不得为私有方法;否则,a 发生编译时错误。
醇>
接口中的方法默认为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中,看看你得到了什么。