我有一个class
(说FOO
),它有一个default
可见性的方法,
如下所示:
void sayHi() {}
现在,如果在扩展I类时覆盖此方法无法降低其可见性。所以我只能使用default
或public
。
public class MyClassTest extends FOO {
@Override
// Or I can use public void sayHi()
void sayHi() {
System.out.println("Overriden sayHi");
}
}
现在,如果我使用下面的默认方法在Java 8中编写接口:
public interface InterfaceX {
// Java-8 defalu method
default String printName() {
System.out.println("Interface1 default metod");
return "Interface1 default metod";
}
}
现在,如果我在类中重写此方法,则应该在保持重写方法的可见性default
时进行编译。
public class Java8InterfaceTest implements InterfaceX{
@Override
void printHello() {
System.out.println("Printing..!");
Interface1.super.printName();
}
}
它说
无法降低InterfaceX
中继承方法的可见性
默认情况下,我已经知道interface
中的public
中的每个方法,但在上面的示例中,我们使用的是default
,我认为这是access modifier
之一java
。
我有以下问题:
default
中的interface
与default
的可见度不同,这是在未应用访问修饰符时提供的吗?答案 0 :(得分:6)
default
与默认可见性无关。接口中的default
方法是在接口中具有默认实现的方法。
该方法的可见性仍为public
。
因此,Java8InterfaceTest
课程中实施的方法必须具有public
可见性:
public void printHello() {
...
}
答案 1 :(得分:3)
我认为如果你把你的界面写成:
interface Test {
default public void go() {
}
}
这是有道理的。 default
方法仍为public
;与“默认”可见性无关。
答案 2 :(得分:2)
其他答案很好地勾勒出"句法"你假设默认是一个"可见性"事情。
但是背后有一个概念问题值得专门回答:降低方法的可见性不是声音。
请记住:耻骨" API"类或接口声明合同以使客户端代码可以使用。比如:在基类/接口eat()
上有一个方法Animal
。
重点是不同的子类/实现可以提供自己的eat()
实现。这样你就可以拥有:
Animal whatever = ...
whatever.eat();
无论...
实际创建的内容(可能是Cat
,Dog
,Unicorn
) - 调用whatever.eat()
都是有效的。
你的想法是说:我想"隐藏"对于特定的子类eat()
,Donkey
。如果你能做到这一点 - 上面的代码突然变得无效。由于whatever.eat()
恰好是whatever
的实例,Donkey
不再是有效通话。
长话短说:阅读Liskov Substitution Principle以了解为什么"带走"公众不是一个好主意 - 完全独立于混合"默认包保护可见性"和 接口中的默认关键字。