繼承抽象類和介面的區別
前言:
抽象類和介面都是在一定程度上體現到了java的多型特性。那麼在使用場景上,它們有什麼區別呢?
在語法方面:
抽象類:
1.由abstract關鍵詞修飾的類稱之為抽象類。
2.抽象類中沒有實現的方法稱之為抽象方法,也需要加關鍵字abstract。
3.抽象類中也可以沒有抽象方法,比如HttpServlet方法。
4.抽象類中可以有已經實現的方法,可以定義成員變數。
介面:
1.由interface關鍵詞修飾的稱之為介面;
2.介面中可以定義成員變數,但是這些成員變數預設都是public static final
3.介面中沒有已經實現的方法,全部是抽象方法。
4.一個類實現某一介面,必須實現介面中定義的所有方法。
5.一個類可以實現多個介面。
在使用方面:
類在繼承抽象類的時候,一個兒子一個爹,爹的財產(非abstract方法和屬性)我都繼承,同時爹的夢想(abstract方法)我幫他去實現。
類在使用介面就像是一個模組化的機器,安上個音訊介面,內部就得做個功放功能。我設計好了要按什麼介面就得有什麼功能。
在結構方面:
抽象類的更像是一種樹形結構,我一個抽象類的範圍就是我下面的子類,別的我管不著也沒必要管。
介面的更像是一種層間結構,我上層跟下層的溝通辦法就是這個介面,上層想怎麼呼叫就按照介面呼叫就行。
在邏輯方面:
按照邏輯順序,一般先設計了介面,後寫類,又因為類變多了,才抽象出了抽象類方便寫更多的類。
介面定義了類的功能,抽象類抽象出了一些類的特徵。
在程式碼書寫方面:
抽象類提高了類和類的內聚程度,減少了程式碼量。
介面降低了類和類的耦合度,但是增加了程式碼量。
總結:
抽象類和介面的使用都可以優化程式,實現高內聚,低耦合。說了這麼多,其實按照設計順序不會有這倆概念上的混淆,什麼時候該用哪個,其實很清楚。
補充
這張圖為java集合類的大致關係結構,這裡面更形象具體的描述了介面和抽象類的使用情況,這個繼承關係代表了總是先出現介面,再出現程式碼,再抽象類。