2011-05-09 56 views
2
interface Block{ 

    void printblock(); 
} 
interface Block2{ 
    void printblock(); 
} 
class Impl2 implements Block,Block2{ 

    @Override 
    public void printblock() { 
     // TODO Auto-generated method stub 
     System.out.println("Impl2"); 
    } 

} 
public class Import 
{ 
    public static void main(String[] args) { 
     new Impl2().printblock(); 
    } 
} 

現在請告訴我哪個printblock方法是通過類Import.Its實現Block接口或Block2接口來實現的嗎?java界面問題

+0

反問:它會有什麼不同? – 2011-05-09 05:14:44

+0

instanceof將爲這兩個接口返回true。 – 2011-05-09 06:05:07

回答

2

由於兩個接口都有相同的方法簽名,兩種方法都將作爲一個方法由Impl2類實現。 Impl2類正在實現一個方法printblock()兩個接口都有相同的簽名。所以你可以說Imlp2正在實現兩個接口的方法。

3

接口只是一個契約,在你的情況下,有兩個不同的接口證明一個類有一個方法實現了一個特定的簽名,所以這個方法屬於哪個接口並不重要。

1

當你寫

新Impl2()printblock()。

它沒有關係printblock是方法的一部分的接口。

如果你寫了類似

Block block1 = new Impl2(); block1.printlblock();或類似的block2.printblock()。

這裏現在都是有效的語句,並且由於兩者具有相同的方法定義,所以將執行相同的方法。有趣的是,因爲他們的定義是一樣的不可能實現同樣的方法定義兩種不同的方式(儘管你希望它不同爲他們每個人)

你的問題已經回答了here

0

在語法上,一個接口除了某個特定名稱的某種方法存在以外,並不意味着任何其他意義。

然而,從語義上講,接口的強大之處在於它們形成了某種方法實現的「保證」,以符合接口本身所描述的行爲。也就是說,通過選擇實施Block或Block2,你可以讓自己符合他們的行爲預期(特別是包含他們的方法)。

在你的榜樣,你的類實現塊和塊2的事實是一個明確的說法你正在實現兩者 - 不要的事實,他們的方法名是相同的混淆!該語法只會告訴您,Impl2中的方法EXISTS。更重要的是Block和Block2定義/期望的行爲。例如,如果您有兩個名爲List和Set的接口,並且希望一個數據結構能夠在語義上表示兩個接口,那麼您可能有一個size()方法,它們對於兩者都是相同的,因此它同時實現了兩個List.size()和Set.size()。

當然,如果你不小心使用語義,接口也很容易被濫用。如果定義了相同的add()方法,那麼實現List和Set都會遇到大問題,因爲根據定義,List.add()行爲允許重複,而Set.add()不允許。所以這裏有一個陷阱 - 你可能認爲你可以基於某些方法的相似性來實現這兩個接口,但事實證明它們在其他方法中定義了基本不同的行爲。

總的來說,在我看來,就像任何時候你用同樣的方法同時實現兩個接口一樣,類設計有些問題。也許你真正想要做的是將共享行爲組合成一個超級界面,並實現它。這將是一個更強大的構造,因爲您將顯式定義接口的共享部分,並且不會遇到具有不同部分的實現問題。