他們都不能實例化對象,都可以包含抽象方法,而且抽象方法必須被繼承的類全部實現。
區別:
1、抽象類和接口都不能直接實例化,如果要實例化,抽象類變量必須指向實現所有抽象方法的子類對象,接口變量必須指向實現所有接口方法的類對象。
2、抽象類要被子類繼承,接口要被類實現。
3、接口只能做方法申明,抽象類中可以做方法申明,也可以做方法實現
4、接口里定義的變量只能是公共的靜態的常量,抽象類中的變量是普通變量。
5、抽象類里的抽象方法必須全部被子類所實現,如果子類不能全部實現父類抽象方法,那么該子類只能是抽象類。同樣,一個實現接口的時候,如不能全部實現接口方法,那么該類也只能為抽象類。
6、抽象方法只能申明,不能實現,接口是設計的結果 ,抽象類是重構的結果
7、抽象類里可以沒有抽象方法
8、如果一個類里有抽象方法,那么這個類只能是抽象類
9、抽象方法要被實現,所以不能是靜態的,也不能是私有的。
10、接口可繼承接口,並可多繼承接口,但類只能單根繼承。
參數 | 抽象類 | 接口 |
默認的方法實現 | 它可以有默認的方法實現 | 接口完全是抽象的。它根本不存在方法的實現 |
實現 | 子類使用extends關鍵字來繼承抽象類。如果子類不 是抽象類的話,它需要提供抽象類中所有聲明的方法的實現。 |
子類使用關鍵字implements來實現接口。 它需要提供接口中所有聲明的方法的實現 |
構造器 | 抽象類可以有構造器 | 接口不能有構造器 |
與正常Java類的區別 | 除了你不能實例化抽象類之外,它和普通Java類沒有任何區別 | 接口是完全不同的類型 |
訪問修飾符 | 抽象方法可以有public、protected和default這些修飾符 | 接口方法默認修飾符是public。你不可以使用其它修飾符。 |
main方法 | 抽象方法可以有main方法並且我們可以運行它 | 接口沒有main方法,因此我們不能運行它。 (java8以后接口可以有default和static方法,所以可以運行main方法) |
多繼承 | 抽象方法可以繼承一個類和實現多個接口 | 接口只可以繼承一個或多個其它接口 |
速度 | 它比接口速度要快 | 接口是稍微有點慢的,因為它需要時間去尋找在類中實現的方法。 |
添加新方法 | 如果你往抽象類中添加新的方法,你可以給它提供默認的實現。因此你不需要改變你現在的代碼。 | 如果你往接口中添加方法,那么你必須改變實現該接口的類。 |
抽象類可以提供成員方法的實現細節,而接口中只能存在public abstract 方法;
抽象類中的成員變量可以是各種類型的,而接口中的成員變量只能是public static final類型的;
接口中不能含有靜態代碼塊以及靜態方法,而抽象類可以有靜態代碼塊和靜態方法;
一個類只能繼承一個抽象類,而一個類卻可以實現多個接口。