引自:https://www.zhihu.com/question/20149818
接口和抽象類都是繼承樹的上層,他們的共同點(diǎn)如下:
1)都是上層的抽象層葱弟。
2)都不能被實(shí)例化
3)都能包含抽象的方法,這些抽象的方法用于描述類具備的功能饵骨,但是不比提供具體的實(shí)現(xiàn)翘悉。
他們的區(qū)別如下:
1)在抽象類中可以寫非抽象的方法,從而避免在子類中重復(fù)書寫他們居触,這樣可以提高代碼的復(fù)用性妖混,這是抽象類的優(yōu)勢;接口中只能有抽象的方法轮洋。
2)一個(gè)類只能繼承一個(gè)直接父類制市,這個(gè)父類可以是具體的類也可是抽象類;但是一個(gè)類可以實(shí)現(xiàn)多個(gè)接口弊予。
Java語言中類的繼承是單繼承原因是:當(dāng)子類重寫父類方法的時(shí)候祥楣,或者隱藏父類的成員變量以及靜態(tài)方法的時(shí)候,JVM使用不同的綁定規(guī)則。如果一個(gè)類有多個(gè)直接的父類误褪,那么會使綁定規(guī)則變得更復(fù)雜责鳍。為了簡化軟件的體系結(jié)構(gòu)和綁定機(jī)制,java語言禁止多繼承兽间。
接口可以多繼承历葛,是因?yàn)榻涌谥兄挥谐橄蠓椒ǎ瑳]有靜態(tài)方法和非常量的屬性嘀略,只有接口的實(shí)現(xiàn)類才會重寫接口中方法恤溶。因此一個(gè)類有多個(gè)接口也不會增加JVM的綁定機(jī)制和復(fù)雜度。
對于已經(jīng)存在的繼承樹帜羊,可以方便的從類中抽象出新的接口咒程,但是從類中抽象出新的抽象類就不那么容易了,因此接口更有利于軟件系統(tǒng)的維護(hù)和重構(gòu)讼育。