- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
多形的效用
繼承 (Inheritance) 第 11 章 本章重點 11 - 1 甚麼是繼承? 11 - 2 多形 (Polymorphism) -- 方法的重新定義 (Overriding) 11 - 3 繼承的注意事項 11 - 4 隱藏的父類別 -- Object 類別 11 - 5 綜合演練 11 - 1 甚麼是繼承? 簡單的說, 繼承就是讓我們可沿用已經設計好的類別, 替它擴充功能以符合新的需求, 定義出一個與舊類別相似, 但具有新方法與新屬性的類別。透過這種方式, 將可大幅提高程式可重複使用的特性, 因為程式開發者, 可藉由繼承的方式, 讓既有的類別, 能順利應用於新開發的程式, 節省開發重複程式的時間。此外藉由繼承的架構, 我們可將不同的類別依據其相似程度,整理成一個體系, 讓我們所開發的程式更加模組化。 甚麼是繼承? 11-1-1 不同物件的相似性 11-1-2 繼承的語法 11-1-3 繼承關係中的物件建構 呼叫父類別的建構方法 11-1-4 再論資訊隱藏 11-1-5 多層的繼承 (Hierarchical Inheritance) 11-1-1 不同物件的相似性 舉例來說, 如果圓形類別可以用圓心座標和半徑這兩個屬性來描述: 不同物件的相似性 假如圓柱體的描述方式是用底部的圓, 再加上圓柱的高度來描述, 則圓柱體類別可定義成: 不同物件的相似性 不同物件的相似性 我們可以發現, 這兩個類別有很多相似之處, 而且 Circle 類別所包含的也都是 Cylinder 類別會出現的部份。如果將兩個類別分別撰寫, 相同的成員變數以及建構方法必須在這兩個類別中重複出現, 如果往後需要修改時, 還必須分別到兩個類別中修改, 不但費事, 也可能因為修改的不一致而導致錯誤。 不同物件的相似性 很顯然的, Cylinder 類別算是 Circle 類別的延伸, 因此在已事先設計好 Circle類別的情況下, 即可利用繼承的方式, 讓 Cylinder 類別繼承 Circle 類別, 我們僅需定義 Cylinder 類別與 Circle 類別不同的部份, 而不需重複定義兩者相同的屬性及方法, 即可完成 Cylinder 類別的定義。 11-1-2 繼承的語法 要繼承現有的類別, 需使用 extends 關鍵字, 語法如下: 例如: 繼承的語法 其中 Circle 稱為父類別 (Parent Class 或 Superclass), 而 Cylinder 則稱為子類別 (Child Class 或 Subclass) 或是衍生類別 (Extended Class) , 有時我們也稱這個動作為:『從 Circle 類別衍生 Cyclinder 類別』。 子類別將會繼承父類別的所有成員變數和方法, 所以子類別的物件可直接使用從父類別繼承而來的成員變數和方法, 以下我們將兩個類的內容先簡化一下, 並來看繼承的效果: 繼承的語法 繼承的語法 繼承的語法 第 19 行定義 Cyclinder 繼承自 Circle 類別, 且未定義任何成員變數及方法,但因父類別的成員變數和方法都會繼承給子類別, 所以實際上 Cylinder 類別也具有成員變數 x、y、r, 不過這些成員變數在 Circle 中被宣告為 private, 所以 Cylinder 類別不能直接存取它們。但可呼叫 public 的 setCenter()、setRadius()、 toString() 等方法。 繼承的語法 所以在第 26 行建立 Cylinder 類別的物件cr 後, 即可透過此物件呼叫上述方法。而執行結果即是 Circle 類別的 toString() 方法, 將成員變數轉成字串的結果, 因此只輸出繼承自父類別的部分, 而沒有輸出圓柱的高度。 11-1-3 繼承關係中的物件建構 前面由 Circle 衍生的 Cylinder 類別中, 並未定義自己的成員變數與方法,所有內容都是由父類別 Circle 繼承而來, 接下來即要替它加入屬於自己的部份。加入自己的成員變數時, 當然要用建構方法來進行初始化, 這時候在衍生類別可以只初始化自己的成員變數, 繼承來的成員變數可交由父類別的建構方法做初始化, 這是因為建立衍生類別的物件時, Java 會自動呼叫父類別的建構方法。我們可由以下的範例, 觀察父類別建構方法是如何被呼叫的: 繼承關係中的物件建構 繼承關係中的物件建構 繼承關係中的物件建構 繼承關係中的物件建構 由執行結果可以發現, 當程式建立 Cylinder 物件 cr, 在呼叫 Cylinder() 建構方法之前, 即已自動呼叫 Circle() 建構方法。道理很簡單, 因為 Cylinder 繼承了 Circle 類別的內容, 因此要產生其物件時, 當然要
文档评论(0)