2011-12-02 65 views
2

只是爲了好奇,我嘗試這樣做:具有相同名稱的繼承方法,它是如何工作的?

public interface test1 { 
    public Object method1(String str); 
} 

public interface test2 { 
    public Object method1(String str); 
} 

public class Test implements test1, test2 {  
    public static void main(String... args) { 

    } 

    public Object method1(String str) { 
     return new Object(); 
    } 
} 

我從Eclipse的期待某種錯誤的在線public class Test implements test1, test2 {,卻沒有一個。

  1. 爲什麼沒有編譯時錯誤,因爲有方法名稱的衝突 ?
  2. class Test中繼承了多少種方法?
  3. 如果上述問題的答案是2,那麼究竟我們實現了哪種方法 ?
  4. 而在運行時,如何正確實施的方法是 被選中?而不是另一個?
  5. 最後,有沒有一種方法來實現兩者? (我幾乎可以肯定,答案是否定的)

我知道從設計的角度來看,這可能不會發生在現實世界的情況下,但正如我剛纔提到的,它剛剛來到我的思想和我試了一下。

任何澄清/參考非常感謝。

+2

有什麼問題?這兩個接口都承諾任何實現它們的類都有一個方法'method1(String)',你的'Test'類實現了這個承諾。 –

+1

如果你有interface1 {public int method1(String var); }和interface2 {public String method1(String var); }。那麼你會得到一個錯誤,因爲沒有執行其中的一個(你無法解決這個問題。) –

+0

@Angelo Neuschitzer:但在那種情況下根本就沒有碰撞 – Bhushan

回答

7

沒有碰撞。這兩個接口都需要一個名爲method1的方法,並且都在您的示例類中的method1滿足。當你實現一個接口時,你根本不會繼承任何方法;你只能保證自己實施這些方法。

爲了回答你的最後一個問題,看到這個現有的SO問題:

Java - Method name collision in interface implementation

有面向Java 8的提案,允許接口指定一個默認的實現,稱爲Virtual Extension Methods。如果這使得它成爲語言,兩個接口就可能爲同一方法簽名指定不同的默認實現。如果這些接口然後由一個類實現,那麼它將不得不提供它自己的實現(即,它將等於既沒有指定缺省值的接口) - 參見3.3。相沖突的默認值

0

您的接口在方法中沒有任何實現,並且它們的簽名是相同的。因此,該方法實際上只有一個版本,並且這是Test類中的實現。

所以實際上並沒有任何名稱衝突。

+0

你不能在接口中添加實現 – hage

+0

我們如何在接口中添加實現細節? – Bhushan

+0

這是我的答案中的一個錯誤 - 我把它拿出來了。 – jefflunt

0

a)即使在接口中有方法名稱的碰撞。實現接口的類需要實現接口的所有方法。在這種情況下,因爲你的類滿足了實現接口的所有條件,所以它不會產生任何錯誤。

該類實現了接口Test1以及Test2的所有方法,並且儘管方法名稱碰撞,實現的編碼滿足所以它不會產生錯誤。b)當你實現接口時沒有什麼可以繼承,所有你需要做的就是在你的類中實現接口的所有方法,否則它必須聲明爲抽象類。

相關問題