抽象類VS介面

茄子_土豆發表於2018-05-25

抽象類VS介面
相同點
      代表系統的抽象層
   都不能被例項化
   都能包含抽象方法
       注意:用於描述系統提供的服務,不必提供具體實現
不同點
       抽象類在抽象方法中可以為部分方法提供預設實現(解釋:抽象類為父類時,可為子類提供他們都有的
   行為且這個行為必須相同,這樣避免程式碼重複,若不相同則應該為抽象方法,去每個子類重寫實現,進
   而去多型。)
       介面只能包含抽象方法(介面不能隨意更改,必須穩定,因為改後所有的實現類都必須改動,但是抽象類
   可以增加普通方法,因為子類會直接繼承過去,這點體現的是抽象類比較於介面的好處)
       一個類只能繼承一個直接的父類(引申問題為什麼只能單根繼承?因為子類覆蓋父類
   的方法java虛擬機器的繫結機制會更加複雜,需要更多的判斷子類覆蓋的到底是哪個父類的方法,這就不明確!增加了java
   虛擬機器的複雜度,所以乾脆單根繼承)
       一個類可以實現多個介面(問題:為啥介面實現多個而繼承只能有一個父類?答:java虛擬機器繫結的是具體實現類,繫結
   非常明確,java虛擬機器的複雜度會小很多)
       已存在的繼承樹,可以方便的抽取介面,但是抽取抽象類不容易。解釋:例如手機(裡面有手機1,手機2)  與照相機
   兩個系統,現在需要給手機2增加照相功能,最直接的方式就增加一個照相的介面,然後手機2實現這個介面,而照相機也實現
   很好改,但是如果想抽象一個照相的抽象類就需要手機2繼承這個類可是手機2只能繼承手機類,如果將照相類間接去讓手機2去繼承
   但手機1也會繼承這就不合理了,所以很難這就是介面更容易。
使用的原則
    介面做系統與外界的互動視窗
      介面提供給別人的服務功能,不會受型別的限制(兩個不一樣的系統,所以系統互訪是以介面來交流的)
 介面本身一旦定製公開,就不允許修改
 抽象類可完成部分功能實現,還有部分功能可作為系統的擴張點(系統的互動用介面,在系統內部有一些功能介於抽象和具體之間
 有部分功能實現而有另外功能需要子類自己去實現就用抽象類)

相關文章