2014-12-04 60 views
2
interface A { 
    default void m() { 
     System.out.println("Hello from A"); 
    }; 
} 

interface B extends A { 
    default void m() { 
     System.out.println("Hello from B"); 
    }; 


} 

interface C extends A { 

} 

class D implements B, C { 

} 

public class Main { 

    public static void main(String[] args) { 
     D obj = new D(); 
     obj.m(); 
    } 

} 

我无法做出决定,这就是为什么我得到一个output..I都仿照这个问题,因为钻石的问题.. 类似于钻石问题这种模式?但它在Java中工作正常.....为什么?问题在接口

+0

你会期望发生什么? – Holloway 2014-12-04 14:21:22

+0

我期待着一个错误。 – 2014-12-04 14:22:44

回答

3

java中的缺省方法的工作原理如下: 如果在具体类中没有提供任何实现,它将默认实现类层次结构中更深层的方法。

在你的代码,因为B延伸AC不提供m()的实现,它实现B将默认为B的实现类。 。

0

“接口给类似多重继承的东西,在 实现这些接口是单独(而不是多个) 继承这意味着,像钻石问题的问题 - 在 该编译器困惑,使用哪种方法 - 在Java中不会出现 。“

Link

+0

国际海事组织更完整的答案将专门解决OP在问题中使用的默认方法。 – NPE 2014-12-04 14:24:37

+0

你能否详细说明你的陈述“接口给出类似于多重继承的东西,这些接口的实现是单独的(而不是多重的)继承” – 2014-12-04 14:28:37

+0

这是我的理解,通过扩展多个接口,你可以模仿多重继承,但是你不能实现多个接口。 – ltalhouarne 2014-12-04 14:40:51

0

为什么这个例子的工作原理是因为Java的能力,实现接口的方法(使用default)是被设计为避免引起金刚石问题的问题的原因。

当继承的类包含一个状态时,菱形问题出现在多重继承中,因为不清楚这个状态应该是共享的还是分离的,以用于类层次结构的不同分支。另一方面,Java的接口不允许任何状态,只允许使用方法。因此,只要它作为一个适当的类来实现(因此可以包含一个状态),就会失去多重继承能力。