1. 程式人生 > >JAVA8新特性下的介面和抽象類的異同

JAVA8新特性下的介面和抽象類的異同

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. 另外,介面只能繼承介面。而抽象類可以繼承普通的類,也能繼承介面和抽象類。