1. 程式人生 > 其它 >介面和抽象類的區別

介面和抽象類的區別

介面和抽象類的區別

  • 抽象類可以存在普通成員函式,而介面中只能存在public abstract方法。

  • 抽象類中的成員變數可以是各種型別的,而介面中的成員變數只能是public static final型別的。

  • 抽象類只能繼承一個,介面可以實現多個。

介面的設計目的,是對類的行為進行約束(更準確的說是一種"有"約束,因為介面不能規定類不可以有什麼行為),也就是提供一種機制,可以強制要求不同的類具有相同的行為。它只約束了行為的有無,但不對如何實現行為進行限制。

而抽象類的設計目的,是程式碼複用。當不同的類具有某些相同的行為(記為行為集合A),且其中一部分行為的實現方式一致時(A的非真子集,記為B),可以讓這些類都派生於一個抽象類。在這個抽象類中實現了B,避免讓所有的子類來實現B,這就達到了程式碼複用的目的。而A減B的部分,留給各個子類自己實現。正是因為A-B在這裡沒有實現,所以抽象類不允許例項化出來(否則當呼叫到A-B時,無法執行)。

抽象類是對類本質的抽象,表達的是is a的關係,比如:BNw is a car。抽象類包含並實現子類的通用特性,將子類存在差異化的特性進行抽象,交由子類去實現。
而介面是對行為的抽象,表達的是like a的關係。比如: Bird like a Aircraft(像飛行器一樣可以飛),但其本質上is a Bird。介面的核心是定義行為,即實現類可以做什麼,至於實現類主體是誰、是如何實現的,介面並不關心。

使用場景:當你關注一個事物的本質的時候,用抽象類;當你關注一個操作的時候,用介面。
抽象類的功能要遠超過介面,但是,定義抽象類的代價高。因為高階語言來說(從實際設計上來說也是)每個類只能繼承一個類。在這個類中,你必須繼承或編寫出其所有子類的所有共性。雖然介面在功能上會弱化許多,但是它只是針對一個動作的描述。而且你可以在一個類中同時實現多個介面。在設計階段會降低難度