【java核心36講】介面和抽象類的區別
阿新 • • 發佈:2018-12-28
- 回答
- 介面和抽象類是java面向物件設計的兩個基礎機制。
- 介面是對行為的抽象,他是抽象方法的集合,利用介面可以達到API定義和實現的分離。介面不能例項化/不能包含非常量成員,任何的feild都是預設public static final的意義;沒有非靜態方法的實現。
- 抽象類也是不能例項化的類,用abstract關鍵字修飾class,其目的主要是程式碼重用,通常抽取相關的java類的公用方法實現或共同的成員變數,然後通過繼承的方式達到程式碼複用的目的。除了不能例項化,同普通的java類沒啥區別,可以有0到多個的抽象方法。
- 實現interface使用implements
- 繼承abstract類使用extends
- 介面類增加方法的情況下,其實現類都需要做相應的修改。當然java8引入的default方法除外。
- 抽象類增加方法,其子類只會享受能力擴充套件,不用擔心編譯問題。
- 擴充套件
- java不支援多繼承的問題
- 規範了程式碼實現的同時,也產生了一些侷限性,影響著程式的設計結構。
- 比如有一些場景需要抽象出與具體實現無關的通用邏輯,或者單純呼叫關係的邏輯,使用傳統的抽象類會陷入單繼承的窘境。成熟的做法是:實現工具類唄。
- 介面類Marker Interface
- 沒有任何抽象方法的介面。目的就是為了生命某些東西,如Cloneable,Serializable等。
- 相比Annotation,該形式簡單直接。但是Annotation可以有引數和值,更加強大。
- @FunctionalInterface Annotation
- 只有一個抽象方法的介面。
- 面向物件的要素
- 封裝:隱藏事務內部的實現細節,以便提高安全性和簡化程式設計。封裝提供了合理的邊界,避免外部呼叫者接觸到內部的細節。可能會觸發更多的問題,如併發問題。
- 繼承:是程式碼複用的基礎機制。
- 多型:會立刻想到重寫/過載/向上轉型。多型是同一個行為具有多個不同表現形式或形態的能力。同一個介面使用不同的例項而執行不同操作。
- 需要遵守的設計原則
- 單一職責
- 開關原則
- 對擴充套件開放,對修改關閉。
- 里氏替換
- 方式可以用父類或者基類的地方,都可以用子類替換。
- 介面分離
- 就是介面的單一職責,這個比普通類的更加重要。
- 依賴反轉
- 這個我感覺應該就是面向介面的程式設計吧。實體應該是依賴抽象而不是實現。
- java不支援多繼承的問題