接口和抽象類之間到底有什麼區別? java
讓咱們再次解決這個問題: 框架
首先要知道的是1/1和1 * 1的結果相同,但這並不意味着乘法和除法相同。 顯然,他們之間保持着良好的關係,可是請注意大家倆是不一樣的。 spa
我將指出主要的區別,其他的都已經解釋了: 對象
抽象類對於建模類層次結構頗有用。 在任何要求乍看之下,咱們對到底什麼是待建部分透明的,但咱們知道如何構建。 所以,您的抽象類就是您的基類。 繼承
接口可用於讓其餘層次結構或類知道個人能力。 當你說我有能力的時候,你必須具有這種能力。 接口會將其標記爲類必須實施相同的功能。 接口
若是要在繼承層次結構中提供多態行爲,請使用抽象類。 get
當您想要徹底不相關的類的多態行爲時,請使用一個接口。 class
一些重要的區別: 變量
以表格的形式: 擴展
正如javapapers的Joe所說 :
1.主要區別在於Java接口的方法是隱式抽象的,沒法實現。 Java抽象類能夠具備實現默認行爲的實例方法。
2. Java接口中聲明的變量默認爲final。 抽象類可能包含非最終變量。
3. Java接口的成員默認狀況下是公共的。 Java抽象類能夠具備類成員的經常使用風格,例如private,protected等。
4.Java接口應使用關鍵字「 implements」來實現; Java抽象類應使用關鍵字「 extends」進行擴展。
5.一個接口只能擴展另外一個Java接口,一個抽象類能夠擴展另外一個Java類並實現多個Java接口。
6.Java類能夠實現多個接口,但只能擴展一個抽象類。
7,接口絕對是抽象的,不能實例化; Java抽象類也沒法實例化,可是能夠在存在main()的狀況下調用。
8,與Java抽象類相比,Java接口比較慢,由於它須要額外的間接調用。
在一個接口中,全部方法都必須僅是定義,而不能實現單個方法。
可是在抽象類中,必須有一個僅具備定義的抽象方法,可是其餘方法也能夠在具備實現的抽象類中...
繼承用於兩個目的:
容許對象將父類型數據成員和方法實現視爲本身的。
容許對一種類型的對象的引用被指望使用超類型對象的代碼使用。
在支持廣義多重繼承的語言/框架中,一般幾乎不須要將類型分類爲「接口」或「抽象類」。 可是,流行的語言和框架將容許一種類型將另外一種類型的數據成員或方法實現視爲其自身,即便它們容許一種類型能夠替換爲任意數量的其餘類型。
抽象類可能具備數據成員和方法實現,但只能由不從任何其餘類繼承的類繼承。 接口幾乎對實現它們的類型沒有任何限制,可是不能包含任何數據成員或方法實現。
有時候,將類型替換爲許多不一樣的東西頗有用; 在其餘狀況下,對象將父類型的數據成員和方法實現視爲本身的對象頗有用。 在接口和抽象類之間進行區分能夠在最相關的狀況下使用每種功能。