接口和抽象類都是繼承樹的上層,他們的共同點以下:
1) 都是上層的抽象層。
2) 都不能被實例化
3) 都能包含抽象的方法,這些抽象的方法用於描述類具有的功能,可是不比提供具體的實現。
他們的區別以下:
1) 在抽象類中能夠寫非抽象的方法,從而避免在子類中重複書寫他們,這樣能夠提升代碼的複用性,這是抽象類的優點;接口中只能有抽象的方法。
2) 一個類只能繼承一個直接父類,這個父類能夠是具體的類也但是抽象類;可是一個類能夠實現多個接口。
Java語言中類的繼承是單繼承緣由是:當子類重寫父類方法的時候,或者隱藏父類的成員變量以及靜態方法的時候,JVM使用不一樣的綁定規則。若是一個類有多個直接的父類,那麼會使綁定規則變得更復雜。爲了簡化軟件的體系結構和綁定機制,java語言禁止多繼承。
接口能夠多繼承,是由於接口中只有抽象方法,沒有靜態方法和很是量的屬性,只有接口的實現類纔會重寫接口中方法。所以一個類有多個接口也不會增長JVM的綁定機制和複雜度。
對於已經存在的繼承樹,能夠方便的從類中抽象出新的接口,可是從類中抽象出新的抽象類就不那麼容易了,所以接口更有利於軟件系統的維護和重構。
圖中若是Sparrow繼承類Bird 類 ,Boyin繼承Airplane類,Sparrow 和Boyin想使用一樣的flay方法那麼是沒有辦法實現的,由於類的繼承是單繼承。
若是Bird和Airplane是接口那麼Boyin想使用一樣的flay方法就很簡單了。在寫一個接口讓Sparrow和Boyin實現這個接口就能夠了以下圖:java

原文地址:https://www.zhihu.com/question/20149818?sort=createdblog