1. 程式人生 > >【java核心36講】介面和抽象類的區別

【java核心36講】介面和抽象類的區別

  • 回答
    • 介面和抽象類是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
      • 只有一個抽象方法的介面。
    • 面向物件的要素
      • 封裝:隱藏事務內部的實現細節,以便提高安全性和簡化程式設計。封裝提供了合理的邊界,避免外部呼叫者接觸到內部的細節。可能會觸發更多的問題,如併發問題。
      • 繼承:是程式碼複用的基礎機制。
      • 多型:會立刻想到重寫/過載/向上轉型。多型是同一個行為具有多個不同表現形式或形態的能力。同一個介面使用不同的例項而執行不同操作。
    • 需要遵守的設計原則
      • 單一職責
      • 開關原則
        • 對擴充套件開放,對修改關閉。
      • 里氏替換
        • 方式可以用父類或者基類的地方,都可以用子類替換。
      • 介面分離
        • 就是介面的單一職責,這個比普通類的更加重要。
      • 依賴反轉
        • 這個我感覺應該就是面向介面的程式設計吧。實體應該是依賴抽象而不是實現。