繼承和抽象的差異


抽象類:

抽象類體現了數據抽象的思想,是實現多態的一種機制。它定義了一組抽象的方法,至於這組抽象方法的具體表現形式由派生類來實現。同時抽象類提供了繼承的概念,它的出發點就是為了繼承,否則它沒有存在的任何意義。所以說定義的抽象類一定是用來繼承的,同時在一個以抽象類為節點的繼承關系等級鏈中,葉子節點一定是具體的實現類。
在語法方面:
1.由abstract關鍵詞修飾的類稱之為抽象類。
2.抽象類中沒有實現的方法稱之為抽象方法,也需要加關鍵字abstract。
3.抽象類中也可以沒有抽象方法,比如HttpServlet方法。
4.抽象類中可以有已經實現的方法,可以定義成員變量。

接口:
接口是用來建立類與類之間的協議,它所提供的只是一種形式,而沒有具體的實現。同時實現該接口的實現類必須要實現該接口的所有方法,通過使用implements關鍵字。 接口是抽象類的延伸,java為了保證數據安全是不能多重繼承的,也就是說繼承只能存在一個父類,但是接口不同,一個類可以同時實現多個接口,不管這些接口之間有沒有關系,所以接口彌補了抽象類不能多重繼承的缺陷,
語法方面:
1.由interface關鍵詞修飾的稱之為接口;
2.接口中可以定義成員變量,但是這些成員變量默認都是public static final的常量。
3.接口中沒有已經實現的方法,全部是抽象方法。
4.一個類實現某一接口,必須實現接口中定義的所有方法。
5.一個類可以實現多個接口。

區別:
一.語法層次上:如上所述。
二.設計層次上:
1、 抽象層次不同。抽象類是對類抽象,而接口是對行為的抽象。抽象類是對整個類整體進行抽象,包括屬性、行為,但是接口卻是對類局部(行為)進行抽象。
2、 跨域不同。抽象類所跨域的是具有相似特點的類,而接口卻可以跨域不同的類。我們知道抽象類是從子類中發現公共部分,然后泛化成抽象類,子類繼承該父類即可,但是接口不同。實現它的子類可以不存在任何關系,共同之處。例如貓、狗可以抽象成一個動物類抽象類,具備叫的方法。鳥、飛機可以實現飛Fly接口,具備飛的行為,這里我們總不能將鳥、飛機共用一個父類吧!所以說抽象類所體現的是一種繼承關系,要想使得繼承關系合理,父類和派生類之間必須存在”is-a” 關系,即父類和派生類在概念本質上應該是相同的。對於接口則不然,並不要求接口的實現者和接口定義在概念本質上是一致的, 僅僅是實現了接口定義的契約而已,相當於是”like-a”的關系。
3、 設計層次不同。對於抽象類而言,它是自下而上來設計的,我們要先知道子類才能抽象出父類,而接口則不同,它根本就不需要知道子類的存在,只需要定義一個規則即可,至於什么子類、什么時候怎么實現它一概不知。比如我們只有一個貓類在這里,如果你這是就抽象成一個動物類,是不是設計有點兒過度?我們起碼要有兩個動物類,貓、狗在這里,我們在抽象他們的共同點形成動物抽象類吧!所以說抽象類往往都是通過重構而來的!但是接口就不同,比如說飛,我們根本就不知道會有什么東西來實現這個飛接口,怎么實現也不得而知,我們要做的就是事前定義好飛的行為接口。所以說抽象類是自底向上抽象而來的,接口是自頂向下設計出來的。

附加,空接口的作用:

通常是作為一個標記,你比如這個Serializable、Cloneable。

                                                                      ---摘自百度百科


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM