考虑下面的例子,
public class Testing extends SupCls implements Intf {
public static void main(String[] args) {
new Testing().test();
}
}
class SupCls {
public void test() {
System.out.println("From SupCls");
}
}
interface Intf {
public default void test() {
System.out.println("From Intf");
}
}
Run Code Online (Sandbox Code Playgroud)
如您所见,SupCls类和Intf接口之间没有任何联系.但两者都定义了一种常用方法.
而Testing类的扩展SupCls和实现Intf.
所以,当我在输出test()上调用方法时Testing,
From SupCls
Run Code Online (Sandbox Code Playgroud)
我认为这是有道理的,因为从类扩展应该比从接口实现更高的优先级.
但是eclipse报告不然,如下面的屏幕截图所示.
我坚信这是Eclipse中的一个错误.
但在假设之前,是否在JLS中定义并记录了此行为?或者还有其他什么来定义这种行为?
编辑:Eclipse版本是Mars Release(4.5.0),如果重要的话.
考虑以下情况,
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");
}
}
Run Code Online (Sandbox Code Playgroud)
在上面的例子中,我得到了非常期待的输出.
Test
Test
Test
Run Code Online (Sandbox Code Playgroud)
我一直在阅读有关Java-8默认方法的内容,特别是有关扩展包含默认方法的接口的内容
2 nd bullet:重新声明默认方法,使其成为抽象方法.
在上面的例子中,我有这有相同名称的默认方法两个接口,当我实现了这两个我才能够达到执行printHello的Test是指IFace2.
我对此几乎没有疑问, …