繼承是面向對象設計的重要思想,其核心是代碼的復用和程序功能高度的擴展性。繼承在詞典中的解釋是把前人的知識、文化、思想、財產、知識等接受過來。在面向對象中,繼承是對類而言的,新類可以繼承已有類的屬性和方法,這樣做的好處是新類可以復用原有類所有的代碼,復用的同時又可以定義新的方法和屬性來擴展原有類的功能。
為了理解繼承思想,下面看一個案例。
某出版機構準備要通過微信小程序實現產品在微信媒體的推廣和銷售,出版機構的產品包括圖書、音頻、視頻,圖書又分為紙書和電子書。現在需要設計產品類,該類能夠存儲出版社所有產品的屬性(如名稱、價格、作者、摘要等產品信息),並能輸出產品的屬性。
由案例內容分析可知,該出版機構有紙質圖書、電子圖書、音頻、視頻產品,每類產品既有共同屬性,如名稱、價格、作者、摘要等屬性,也有個性化屬性,如紙質圖書有字數、頁數等屬性,視頻有解析度、播放時長、文件大小、編碼等屬性,音頻有採樣頻率、文件大小、編碼等屬性,電子圖書有格式、文件大小等屬性。
前面我們學過抽象和封裝,可以把同類事物的共同屬性抽取出來形成類,既然該出版機構的紙質圖書、電子圖書、視頻、音頻產品都具有共同屬性名稱、價格、作者、摘要,可以創建一個Product產品類,代碼如下:
Product類聲明了該出版機構產品的共同屬性名稱、價格、作者、摘要,並定義了輸出產品屬性的方法outProduct()。
但該類並沒有完全實現任務要求,因為該類的屬性並沒有全部反映出該出版機構所有產品的屬性,如紙質圖書、電子圖書、視頻、音頻產品的個性化屬性。
如何解決這個問題呢,有兩種解決方案,一種解決方案是每類產品都創建為一個類,該類包含該產品的所有屬性,即分別創建紙質圖書類、電子圖書類、視頻類和音頻類,鑑於篇幅關係下面僅給出紙質圖書類的代碼:
例子代碼僅給出了紙質圖書類的代碼,電子圖書類、視頻類和音頻類可參照紙質圖書類代碼創建。這樣創建的代碼也可以完成案例任務要求,問題是創建的四個產品類中都有重複的屬性和方法,代碼重複,不符合面向對象的設計原則。
另外一種解決方案就是採用Java的類繼承機制,利用Java的類繼承機制可以讓紙質圖書類,電子圖書類、視頻類和音頻類均繼承於Product類,被繼承的Product稱為父類,繼承的紙質圖書類,電子圖書類、視頻類和音頻類稱為子類,子類繼承父類的所有屬性和方法,同時子類可以聲明自己特有的屬性和方法。下圖給出了出版機構的產品類繼承圖。

在Java中子類繼承父類是通過extends關鍵字來實現繼承的。下面給出電子圖書類、視頻類的子類代碼,其它子類代碼請自行創建:
電子圖書類代碼
EBook類是Product類的子類,繼承了Product類的全部屬性和方法,也包括構造方法,Product類是EBook類的父類。程序創建Ebook對象時,需用super關鍵字調用父類的構造函數以初始化父類的數據,super關鍵字主要用於指向子類對象中的父類對象。
視頻類代碼
視頻類代碼的結構同電子圖書類代碼結構相同,這裡就不作解釋了。細心的同學可能會發現EBook類和Video類也具有共同的屬性formation和filesize,可以把formation和filesize提取出來抽象為一個新的電子出版物類,電子圖書類、視頻類、音頻類繼承電子出版物類,電子出版物類又繼承於產品類,從而構成產品類的層次結構,產品類層次結構如下圖所示:

類的層次結構充分體現了面向對象編程的繼承思想,高度抽象出的事物(Product類)再不斷細化為接近現實的事物(PaperBook類和EProduct類),EProduct類又可以細化為具體事物(EBook、Video、Audio類),層層繼承,高度復用了已有代碼。
■ 知識點撥
面向對象的繼承思想是也是一種系統設計思想,系統從高度抽象入手構建基礎抽象類,基礎抽象類滿足系統所有類的基本屬性和操作要求。所有系統類均繼承於基礎抽象類,繼承的系統類又可以被更具體化的子類繼承,從而構成了系統的類層次結構。Java語言的Objec類就是一個基礎抽象類,Java所有的類都繼承於Objec類,JDK就是一個很好的類層次結構例子。
■ 思考與練習
請參照教材內容樣例代碼,給出圖 12-2類層次結構圖的實現代碼。