2014-02-21 58 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表示「繼承無關的默認值以獲得樂趣」。如果沒有任何樂趣,班級會是什麼? –