常常搞不清抽象類和接口之間的關係,因此決定記下來php
《Thinking in Java》一書中對抽象類的定義爲:html
包含了抽象方法的一個類叫做「抽象類」。若是一個類裏包含了一個或多個抽象方法,類就必須指定成
abstract(抽象)。不然,編譯器會向咱們報告一條出錯消息。 web
其實用關鍵字abstract修飾的類便是抽象類,即便該類中沒有用abstract修飾的抽象方法。編程
抽象方法是一種特殊的方法:它只有聲明,而沒有具體的實現。抽象方法的聲明格式爲:svg
abstract void method_name()
抽象方法必須用 abstract 修飾,含有抽象方法的類就是抽象類,必須在類前用 abstract 修飾。
因爲抽象類中含有無具體實現的方法,因此不能用抽象類建立對象。函數
由此能夠看出抽象類就是爲了被繼承而存在的,抽象類中包含了子類的共通特性。若是定義了一個抽象類卻不去繼承它,至關於白白建立了這個抽象類。
同時,抽象類也跟普通類同樣,能夠擁有成員變量和普通的成員方法。spa
接口,英文稱做interface。在軟件工程中,接口泛指供別人調用的方法或者函數,是對行爲的抽象。在Java中,定一個接口的形式以下:code
[public] interface InterfaceName {
}
接口中能夠包含基本數據類型的數據成員和方法,須要注意的是接口中的數據成員都默認爲static和final,接口中方法只能是public abstract修飾的抽象方法。
接口中的全部方法都不能有具體實現。實現接口的類必須實現接口中全部的抽象方法,一個類能夠實現多個接口,經過關鍵字implements。xml
class className implements interface1,interface2,[...]{
}
若是抽象類實現了一個接口,該抽象類能夠不實現接口中的抽象方法。htm
參數 | 抽象類 | 接口 |
---|---|---|
默認的方法實現 | 能夠有默認的方法實現 | 接口徹底是抽象的。它根本不存在方法的實現 |
實現 | 子類經過extents關鍵字繼承抽象類。若是子類不是抽象類,須要實現父類中全部聲明的方法的實現 | 子類經過關鍵字implements實現接口,須要提供接口中全部生命方法的實現 |
構造器 | 能夠有構造器 | 不能有構造器 |
與普通類的區別 | 除了不能實例化,其餘的跟普通類沒有任何區別 | 接口是徹底不一樣的類型 |
訪問修飾符 | 抽象類方法能夠用public、protected和default修飾 | 接口方法只能用public修飾,成員屬性只能定義爲 public static final |
main方法 | 抽象類能夠有main方法且能夠運行 | 接口沒有main方法,不能運行 |
多繼承 | 抽象方法能夠繼承一個類或者實現多個接口 | 只能繼承一個或多個接口 |
速度 | 速度比接口要快 | 接口是稍微有點慢的,由於它須要時間去尋找在類中實現的方法。 |
添加新方法 | 若是在抽象類中添加新方法,能夠給該方法提供默認的實現,不須要改變如今的代碼 | 在接口中添加新方法後必須改變實現該接口的類 |
http://www.importnew.com/18780.html
http://www.importnew.com/12399.html 《Java編程思想》