接口和抽象類

轉載註明:https://blog.csdn.net/starbxx/article/details/95316647

在Java中,可以通過兩種形式來體現OOP的抽象:接口和抽象類。
1.抽象類:

[public] abstract class ClassName { 
    abstract void fun(); 
} 

(1)抽象方法:抽象類定義爲“包含抽象方法的類”,即包含抽象方法的類一定是抽象類,但是抽象類不一定包含抽象方法(咬文嚼字)。抽象方法和抽象類前面加abstract修飾符。

(2)成員變量:抽象類同樣可以擁有成員變量。

(3)普通的成員方法:抽象類同樣可以擁有普通的成員方法,並且實現。

2.接口

[public] interface InterfaceName { 

} 

(1)抽象方法:接口包含抽象方法。

(2)成員變量:接口中的變量會被隱式地指定爲public static final變量(並且只能是public static final變量,用private修飾會報編譯錯誤)。

(3)普通的成員方法JDK8之前,接口中的方法必須都是抽象方法,JDK8 之後,接口也可以擁有默認的方法實現,這是因爲不支持默認方法的接口的維護成本太高,如果想給一個接口添加一個新的方法,那麼需要修改所有實現了該接口的類。

3.抽象類和普通類的區別
(1)抽象方法必須爲public或者protected(因爲如果爲private,則不能被子類繼承,子類便無法實現該方法),缺省情況下默認爲public。

(2)抽象類不能用來創建對象,不能實例化;

(3)如果一個類繼承於一個抽象類,則子類必須實現父類的所有抽象方法。如果子類沒有實現父類的抽象方法,則必須將子類也定義爲爲abstract類。

4.接口和抽象類的區別

接口(interface)和抽象類(abstract class)是支持抽象類定義的兩種機制。

相同點
(1)都不能被實例化。

(2)接口的實現類或抽象類的子類都只有實現了接口或抽象類中的方法後才能實例化。

不同點:
(1)接口只有定義,不能有方法的實現,而抽象類可以有定義與實現,方法可在抽象類中實現(JDK8之前)。接口和抽象類都可以有方法的定義(JDK8之後)。

(2)實現接口的關鍵字爲implements,繼承抽象類的關鍵字爲extends。一個類可以實現多個接口,但一個類只能繼承一個抽象類。所以,使用接口可以間接地實現多重繼承。

(3)接口成員變量默認爲public static final,必須賦初值,不能被修改;其所有的成員方法都是public、abstract的。抽象類中成員變量默認default,可在子類中被重新定義,也可被重新賦值;抽象方法被abstract修飾,不能被private、static、synchronized和native等修飾,必須以分號結尾,不帶花括號。

(4)接口強調特定功能的實現,而抽象類強調所屬關係

(5)接口被用於常用的功能,便於日後維護和添加刪除,而抽象類更傾向於充當公共類的角色,不適用於日後重新對立面的代碼修改。功能需要累積時用抽象類,不需要累積時用接口。

發佈了20 篇原創文章 · 獲贊 2 · 訪問量 2613
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章