考虑以下情况,
在上面的例子中,我得到了以下输出,这是相当预期的。
引用说,你可以在子接口中将
interface IFace1 {
default void printHello() {
System.out.println("IFace1");
}
}
interface IFace2 {
void printHello();
}
public class Test implements IFace1, IFace2 {
public static void main(String[] args) {
Test test = new Test();
test.printHello();
IFace1 iface1 = new Test();
iface1.printHello();
IFace2 iface2 = new Test();
iface2.printHello();
}
@Override
public void printHello() {
System.out.println("Test");
}
}
在上面的例子中,我得到了以下输出,这是相当预期的。
Test
Test
Test
我一直在阅读有关 Java-8
默认方法的内容,尤其是关于扩展包含默认方法的接口的内容。
第二个项目:重新声明默认方法,使其成为抽象方法。
在上面的例子中,我有两个接口,它们都有相同名称的默认方法,当我实现它们时,我只能到达 Test
的 printHello
的实现,它引用了 IFace2
。
我有几个问题:
- 我如何才能到达
IFace1
的printHello
方法?如果我不能,那为什么? - 这种行为难道不会让我远离
IFace1
的本意吗?它现在可能被其他方法所掩盖了吗?
引用说,你可以在子接口中将
default
方法设置为abstract
。 例如,
interface IFace2 extends IFace1 {
void printHello();
}
当我实现IFace2
时,我将无法实际访问IFace1
的default
方法,这正是我目前遇到的情况。
new Test().printHello()
都将始终调用在Test
中声明的方法。 - Holger