2014-05-15 64 views
-3

從概念上講,我知道抽象類和接口之間的區別。但想知道這兩者之間的技術差異。爲什麼Sun製作了這個界面術語,即使我可以完全抽象出類並完成我的工作。抽象類和接口之間的技術區別

+2

這就是Sun如何避免多重繼承的所有問題。一個類可以是多個接口的直接子類型,但只能是一個抽象類;所以你不會得到鑽石問題(至少在Java 8中,這是第一次向Java引入鑽石問題)。 –

+0

你可能想看看http://stackoverflow.com/questions/18777989/difference-between-an-interface-and-an-abstract-class/18778307#18778307 –

回答

0

你可以自由選擇在上述情形

interfaceabstract class但要低於事情記住

,如果你犯了一個fully abstract class然後

subclassextend一個類來實現該行爲和 它不符合擴展任何其他類的資格,因爲在java中不支持multiple inheritance

看不到interface我們無法達到multiple inheritance

現在,如果我們接觸的interface代替fully abstract

那麼類可以實現,而且仍然eligable多一個類的擴展。

所以如果您的sub classes永遠不需要擴展任何其他類,請在您的設計中選擇fully abstract類。

如果sub classes需要稍後擴展一些類(通常是我們在應用中需要的),然後選擇interface

1

這裏閱讀http://javarevisited.blogspot.kr/2013/05/difference-between-abstract-class-vs-interface-java-when-prefer-over-design-oops.html

抽象類和接口的區別在Java中

抽象類V5接口在Java中,何時在使用它們otherWhile決定何時使用接口和抽象類,重要的是要知道區別在Java中的抽象類和接口之間。在我看來,它們之間的兩個區別決定了何時使用Java中的抽象類或接口。

1)Java中的接口只能包含聲明。你不能在界面中聲明任何具體的方法。另一方面,抽象類可能包含抽象方法和具體方法,這使抽象類成爲提供通用或默認功能的理想場所。我建議閱讀我的10篇關於Java接口的知識,以更多地瞭解接口,特別是Java編程語言。 2)Java接口可以擴展多個接口,Java類也可以實現多個接口,這意味着接口可以提供比抽象類更多的多態性支持。通過擴展抽象類,一個類只能參與一個Type層次結構,但通過使用接口,它可以成爲多個類型層次結構的一部分。例如。一個類可以同時運行和顯示。我記得的一個例子是在J2ME中編寫GUI應用程序,其中類擴展了Canvas並實現了CommandListener以提供圖形和事件處理功能。

3)爲了在Java中實現接口,抽象的,你需要提供所有方法的實現,這是非常痛苦的。另一方面,抽象類可以在這種情況下通過提供默認實現來幫助你。因爲這個原因,我更喜歡在接口中使用最少的方法,從一開始,我不喜歡標記接口的想法,一旦在Java 5中引入了註釋。如果您看起來像JDK或任何像Spring一樣的框架,爲了更好地理解OOPS和設計模式,你會發現大部分界面只包含一兩種方法,例如Runnable,Callable,ActionListener等。

我沒有在Java中包含抽象類和接口之間的所有語法差異,因爲這裏着重學習何時使用抽象類和接口並選擇其中之一。儘管如此,你可以看到接口和抽象類之間的區別,以找到所有這些語法差異。

瞭解更多:http://javarevisited.blogspot.com/2013/05/difference-between-abstract-class-vs-interface-java-when-prefer-over-design-oops.html#ixzz31l59K92Z

0

因爲你可以有一個類實現2個接口,但你不能有一個類實現(或擴展)2抽象類。

+0

一個很好的簡潔的答案。 –

0

您編寫了一個帶有接口,抽象類和具體類的java程序,但沒有提及任何構造函數,編譯它並查看.class文件中的字節代碼。您會看到預期的抽象類和具體類具有由編譯器添加的默認構造函數,其中接口不會將構造函數通過編譯器添加到其中。這應該有助於您理解技術差異,因爲我相信您知道其他差異。

+1

這對我來說真的很有幫助。 – syadav

0

我可能會收到downvotes爲這個答案:)。考慮這種情況。

public class TestClass{ 

    /** 
    * @param args 
    */ 
    public static void main(String[] args) { 
     // TODO Auto-generated method stub 
     Fish f = new Fish(); 
     f.walk(); 
    } 

} 

abstract class Animal { 
    protected void walk() { 
     System.out.println("walking"); 
    } 
} 

class Fish extends Animal { 

} 

O/P:走

技術上魚不能走路。自從它擴展了動物類以來,它可以「走」,從設計的角度來看這是錯誤的(即使魚沒有實現walk(),它仍然可以稱之爲)。如果Animal是一個接口,那麼Fish必須實現它不會/不應該的方法walk()。所以,你將被迫重新審視設計。

-1

抽象類可以有一些實現代碼和實例變量。一個接口只有方法簽名和靜態變量定義,沒有實現代碼。此外,如果您實現了一個接口,則必須包含接口中定義的所有方法的實現代碼。

+2

如果你打算投票,至少要提供一個解釋,說明這個答案有什麼問題 – Chad

相關問題