1 二者表達的概念不同。抽象類是一類事物的高度聚合,與子類的關係屬於「是」的關係;而接口是定義行爲規範,所以對於實現接口的子類來講,相對於接口來講,是「行爲須要按照接口來完成」。spa
2 抽象類在定義類型方法的時候,能夠給出方法的實現部分,也能夠不給出;而對於接口來講,其中所定義的方法都不能給出實現部分。繼承
3 繼承類對於二者所涉及方法的實現是不一樣的。繼承類對於抽象類所定義的抽象方法,能夠不用重寫,也就是說,能夠延用抽象類的方法;而對於接口類所定義的方法或者屬性來講,在繼承類中必需要給出相應的方法和屬性實現。
4 在抽象類中,新增一個方法的話,繼承類中能夠不用做任何處理;而對於接口來講,則須要修改繼承類,提供新定義的方法。
以下給出二者的簡單對比表格。接口
參數 | 抽象類 | 接口 |
默認的方法實現 | 它能夠有默認的方法實現 | 接口徹底是抽象的。它根本不存在方法的實現 |
實現 | 子類使用extends關鍵字來繼承抽象類。若是子類不是抽象類的話,它須要提供抽象類中全部聲明的方法的實現。 | 子類使用關鍵字implements來實現接口。它須要提供接口中全部聲明的方法的實現 |
構造器 | 抽象類能夠有構造器 | 接口不能有構造器 |
與正常Java類的區別 | 除了你不能實例化抽象類以外,它和普通Java類沒有任何區別 | 接口是徹底不一樣的類型 |
訪問修飾符 | 抽象方法能夠有public、protected和default這些修飾符 | 接口方法默認修飾符是public。你不可使用其它修飾符。 |
main方法 | 抽象方法能夠有main方法而且咱們能夠運行它 | 接口沒有main方法,所以咱們不能運行它。 |
多繼承 | 抽象方法能夠繼承一個類和實現多個接口 | 接口只能夠繼承一個或多個其它接口 |
速度 | 它比接口速度要快 | 接口是稍微有點慢的,由於它須要時間去尋找在類中實現的方法。 |
添加新方法 | 若是你往抽象類中添加新的方法,你能夠給它提供默認的實現。所以你不須要改變你如今的代碼。 | 若是你往接口中添加方法,那麼你必須改變實現該接口的類。 |
Oracle已經開始嘗試向接口中引入默認方法和靜態方法,以此來減小抽象類和接口之間的差別。如今,咱們能夠爲接口提供默認實現的方法了而且不用強制子類來實現它。這類內容我將在下篇博客進行闡述。博客