1. 程式人生 > >Java中抽象類與介面區別

Java中抽象類與介面區別

抽象類:抽象類是無法例項化的特殊類。所以問題是為什麼我們需要一個不能被例項化的類,抽象類只能是子類(繼承自)。換句話說,它只允許其他類繼承它,但不能例項化。優點是它為所有子類執行特定的層次結構。簡而言之,它是一種契約,它強制所有子類執行相同的層次或標準。

介面:介面不是類,由Interface關鍵詞定義,介面只有方法簽名,沒有方法實現(8之後支援預設方法)。與抽象類類似,它也是一種契約,用於定義所有子類的層次結構,或者它定義了特定的方法集和它們的引數。它們之間的主要區別是,一個類可以實現多個介面,但只能繼承一個抽象類。

屬性 介面 抽象類
多繼承 一個類可以實現多個介面 一個類只能繼承一個抽象類
預設實現 介面只包含介面簽名 抽象類可以提供預設實現,子類可以過載抽象類方法
訪問修飾符 介面預設所有的方法均為public 抽象類可以包含protected修飾符
內在 vs 外在 介面用以定義類具備的外在能力特徵,比如人和車輛都具備可移動的特性,因此他們均可以繼承實現IMovable介面。 抽象類定義的是類所具備的內在特徵,如果應用場景需要定義同一型別的物件,最好使用抽象。
同質性 如果應用場景是同一方法的不同實現,那麼最好是使用介面 如果不同的方法實現需要共享同樣的行為或者狀態(
參考上一章的裝飾器模式例項
),那麼抽象類是首選
速度 因為編譯器需要確定方法實現類,所以,相對於抽象類,介面通常耗時會更長。
重構代價:功能升級 如果我們需要為介面新增一個簽名方法,那麼我們必須對應修改所有介面實現類,並且為新方法指定方法實現。 如果我們需要為抽象類新增方法,我們可以僅在抽象類中指定預設實現,而無須修改所有實現類。
屬性與常量 介面中不允許定義任何屬性 抽象類中允許定義屬性和常量