2014-02-21 59 views
-2

问题2:以下接口有什么问题?java中的默认方法8

public interface SomethingIsWrong { 
    void aMethod(int aValue) { 
     System.out.println("Hi Mom"); 
    } 
} 

答2:它有它的方法实现。只有默认和静态方法有实现(我认为这是错误的,因为由于缺省的方法它的方法是抽象的,因此接口不能有身体方法)。

问题3:修正了问题2.

答案3的界面:

public interface SomethingIsWrong { 
    void aMethod(int aValue); 
} 

替代地,可以定义作为amethod方法默认方法:

public interface SomethingIsWrong { 
    default void aMethod(int aValue) { 
     System.out.println("Hi Mom"); 
    } 
} 

我在docs.oracle.com发现了这个,我想知道这些是O提供的正确答案RACLE? 在我看来。

1.在答案2中写道,只有默认和静态方法才有实现?

2.在答案3中,它给出了aMethod可以被定义为默认方法,但接口在其中不能有方法体,因为默认情况下接口中的方法是抽象的,我们只能在其子类中实现它的方法。

请让我知道是ORACLE网站的对错吗?

+1

给链接.. – swapnil7

+2

请不要在美国发布。 –

+0

如果它值得任何东西,[这似乎是相关的Oracle页面](http://docs.oracle.com/javase/tutorial/java/IandI/QandE/interfaces-answers.html)。 – PakkuDon

回答

11

您正在查看的页面讨论即将发布的Java 8,其中接口可以具有包含实现的“默认”方法,并且也可以具有静态方法。

在Java 8之前,接口方法实际上不能有一个主体,接口也不能有静态方法。

+3

哦,太棒了,所以我们不再需要课程了!这是否给我们多重继承?钻石继承问题? Yeeha! –

+0

没有钻石问题。请参阅http://www.lambdafaq.org/what-about-the-diamond-problem/。课程仍然非常需要。默认方法不能是最终的。接口仍然不能有状态和构造函数。 –

+0

该页面并不满足我没有钻石问题。如果(在该示例中),具有相同签名但不同实现的方法在'B'和'C'中?没有办法知道哪一个'D'会继承。 –

2

默认方法将在java 8中引入,也称为后卫方法

如果类实现了两个接口并且这两个接口定义了一个具有相同签名的默认方法,那么在默认方法中可能导致多重继承中钻石问题的一个重要方面是?

public interface Foo { 
    default void fun(){ 
     System.out.println("Calling Foo.fun()"); 
    } 
} 

public interface Bar { 
    default void fun(){ 
     System.out.println("Calling Bar.fun()"); 
    } 
} 


public class FooBar implements Foo, Bar { 
} 

在这种情况下,它会产生编译错误 -

java: class FooBar inherits unrelated defaults for fun() from types Foo and Bar 

在这种情况下类FooBar将被迫重写冲突的方法fun。所以正确的实施将

public class FooBar implements Foo, Bar { 
    public void fun(){...} 
} 
+3

+1表示“继承无关的默认值以获得乐趣”。如果没有任何乐趣,班级会是什么? –