Java中,抽象類和接口有相似的地方。下面我們就來細說說接口和抽象類的異同。
首先是相同的地方:
1. 接口和抽象類都能定義方法和屬性。
2. 接口和抽象類都是看作是一種特殊的類。大部分的時候,定義的方法要子類來實現
3. 抽象類和接口都可以不含有抽象方法。接口沒有方法就可以作為一個標志。比如可序列化的接口Serializable,沒有方法的接口稱為空接口。沒有抽象方法的抽象類,小編不知道有什么作用,總之是可以通過編譯的。
4. 抽象類和接口都不能創建對象。
5. 抽象類和接口都能利用多態性原理來使用抽象類引用指向子類對象。
6. 繼承和實現接口或抽象類的子類必須實現接口或抽象類的所有的方法,抽象類若有沒有實現的方法就繼續作為抽象類,要加abstract修飾。若接口的子類沒有實現的方法,也要變為抽象類。
下面是接口和抽象類的不同點:
1. 接口能夠多實現,而抽象類只能單獨被繼承,其本質就是,一個類能繼承多個接口,而只能繼承一個抽象類。
2. 方法上,抽象類的方法可以用abstract 和public或者protect修飾。而接口默認為public abttact 修飾。
3. 抽象類的方法可以有需要子類實現的抽象方法,也可以有具體的方法。而接口在老版本的jdk中,只能有抽象方法,但是Java8版本的接口中,接口可以帶有默認方法。
4. 屬性上,抽象類可以用各種各樣的修飾符修飾。而接口的屬性是默認的public static final
5. 抽象類中可以含有靜態代碼塊和靜態方法,而接口不能含有靜態方法和靜態代碼塊。
6. 抽象類可以含有構造方法,接口不能含有構造方法。
7. 設計層面上,抽象類表示的是子類“是不是”屬於某一類的子類,接口則表示“有沒有”特性“能不能”做這種事。如飛機和鳥都能飛,但是他們在設計上實現一個Fly接口,實現fly()方法。遠比兩個類繼承飛行物抽象類好得多。因為,飛機和鳥有太多的屬性不一樣。
8. 設計層面上,另外一點,抽象類可以是一個模板,因為可以自己帶集體方法,所以要加一個實現類都能有的方法,直接在抽象類中寫出並實現就好,接口在以前的版本則不行。新版本Java8才有默認方法。
9. 既然說到Java 8 那么就來說明,Java8中的接口中的默認方法是可以被多重繼承的。而抽象類不行。
10. 另外,接口只能繼承接口。而抽象類可以繼承普通的類,也能繼承接口和抽象類。