2.4 抽象類

抽象類是一種特殊的類,其特殊性在於抽象類只能用於繼承,不能被實例化爲具體的對象。例如在Java中不能new一個抽象類,但能夠extends一個抽象類。設計

抽象類的定義其實很簡單,但其使用並不那麼簡單,有幾個問題咱們須要深刻研究一下。對象

第一個問題是:有了類,爲何還要抽象類,爲何設計一種只能繼承,不能實例化的類?繼承

答案就在於:某些場景下普通類不夠用。例如,「蘋果」、「桔子」、「香蕉」都是「水果」,這裏的「水果」就是一個抽象類。你能夠說你喜歡吃「水果」,但你真正吃「水果」的時候,要麼是「蘋果」,要麼是「桔子」,要麼是「香蕉」。。。。。。但你毫不可能真正吃到一個叫作「水果」的東東。接口

從設計的角度來看,抽象類是更高層次的抽象。若是說普通類是從現實對象抽象出來的,那麼抽象類就是基於類而抽象出來的。例如上面的樣例,從「蘋果」、「桔子」、「香蕉」這幾個普通類,抽象出了「水果」這個類。遊戲

從實現的角度來看,抽象類與普通類不一樣的地方在於:抽象類有的存在抽象方法(方法只有聲明,沒有定義),子類必須本身定義這些抽象方法,而不能像普通的方法同樣,經過繼承就能夠得到父類的方法。這一點上來看,抽象類和接口有點相似。方法

第二個問題是:抽象類和接口有什麼區別,爲何有了接口,還要有抽象類?工作

答案就在於:抽象類本質上仍是類,強調一組事物的類似性,包括屬性和方法的類似性;而接口只強調方法的類似性,而且僅僅體如今方法聲明上的類似性,而沒有方法定義上的類似性。new

例如:假設咱們設計一個遊戲,其中使用「蘋果」、「桔子」、「香蕉」來作「補血」,「蘋果」、「桔子」、「香蕉」都有「顏色」、「重量」這樣的屬性,但每種水果的補血方式是不同的。這種狀況下,使用抽象類能夠很好的表達,咱們設計一個抽象類「水果」,將「顏色」、「重量」做爲「水果」的屬性,「獲取顏色」、「獲取重量」、「減小重量」等方法做爲「水果」的方法,將「補血」做爲「水果」的抽象方法。這樣設計可以大大減小「蘋果」、「桔子」、「香蕉」幾個普通類的實現工做量,它們只須要實現「補血」方法,其它的屬性和方法都只需繼承「水果」類便可。而若是採用接口的方式實現,則「蘋果」、「桔子」、「香蕉」每一個類都須要本身增長「顏色」、「重量」屬性,增長「獲取顏色」、「獲取重量」、「減小重量」、「補血」等方法,工做量和代碼量大大增長。實例化

綜合上述的分析,咱們能夠看出,抽象類看起來是一個介於類和接口之間的一個概念,同時具有類和接口的部分特性。顏色

相關文章
相關標籤/搜索