學習目標:
在本章中,你將學到:
*繼承如何處進軟體再利用。
*父類別與子類別的概念,以及兩者之間的關係。
*用關鍵字extends建立類別,以繼承另外一個類別的屬性及行為。
*使用存取修飾詞protected,讓子類別能存取父類別的成員。
*使用super來存取父類別成員。
*如何在繼承階層中使用建構子。
*Object類別的方法,Object為所有類別的直接或間接父類別。


9.1簡介
繼承(inheritance)
子類別(subclass);(C++語言將子類別稱為衍生類別[derived class])
父類別(superclass);(C++語言則將父類別稱為基礎類別[base class])
每個子類別都可能成為未來其他子類別的父類別。
子類別可以加入自己的欄位和法。因此,子類別通昂比父類別更為特定,代表更特殊的一群物件。
子類別會展現其父類別的行為,也可以修改這些行為,令其能妥善地操作子類別。
這就是繼承有時也會稱為特殊化(specialization)的原因。

直接父類別(direct superclass),指的是子類別明確繼承的父類別。
間接父類別(indirect superclass),指的則是在定義了類別之間繼承關係的類別階層(class hierarchy)中,
任何位於其直接父類別之上的類別。在Java中,類別階層試以Object類別(位於套件java.lang中)為起點,
Java的所有類別,都是直接或間接地擴充自(extend,或曰繼承自)Object類別而來。

*Java只支援單一繼承(single inheritance),亦即每個類別只能衍生自唯一一個直接父類別。
與C++不同,Java並不支援多重繼承(亦即一個類別可以衍生自多個直接父類別)。
在第10章,物件導向程式設計:多型,會解釋如何使用Java介面,來實現多重繼承的許多優點,同時又避免其相關的問題。

我們得分別是一種關係(is a relationship) 和擁有關係(has a relationship)的不同。

*新的類別可以繼承自類別庫(class library)中的類別。
企業會開發自己的類別庫,也可以利用世界上其他可取得的類別庫。
未來,大部分的新軟體可能會從標準化的可再利用元件(standardized reusable component) 組合而成,
就跟今日的汽車和大部分電腦硬體的組成方式一樣。
這樣能幫助我們開發功能更強大;更豐富也更經濟的軟體。


9.2父類別與子類別
經常,我們會看到某類別的物件也是另一個類別的物件。
圖9.1列出了幾個父類別與子類別的簡單案例----父類別通常「比較一般化」,子類別則「比較特定」。

因為每個子類別物件都是一種父類別物件,而一個父類別可以有許多子別,
所以父類別所代表的物件集合,通常大於任何其子類別所代表的物件集合。
如,父類別Vehicle代表所有的交通工具,包含汽車、卡車、船、腳踏車等等。
相較之下,子類別Car代表的是較小,較特定的交通工具子集合。


9.3protected成員
第8章已經討論過存取修飾詞public和private。
只要程式有指向該類別物件的參照,或指向其子類別物件的參照,就可以取用類別的public成員。
類別的private成員,則只有類別本身才能加以存取。
在本節,我們會介紹存取修飾詞protected。
使用protected存取全,會提供介於public與private之間的存取權限層級。

*父類別的protected成員,只能被父類別的成員、及其子類別的成員,以及同套件中其他類別的成員存取----protected成員也具有套件存取權。

所有父類別的public、protected成員,在他們變為子類別成員時,
都會保有原來的存取修飾詞----父類別的public會變成子類別的public成員,父類別的protected成員會變成子類別的protected成員。
父類別的private成員,在類別本身以外的地方,是無法加以存取的。
反之,他們會被隱藏在子類別中,只能透過繼承自父類別的public及protected方法來加以存取。

*子類別方法僅須透過成員名稱即可使用父類別的public與protected成員。
當子類別方法覆寫了所繼承的父類別方法時,子類別還是可以在父類別方法名稱的前面,
加上關鍵字super和一個點號(.)  分隔符號,來使用父類別的方法。我們會在9.4節中,討論如何使用遭到覆寫的父類別成員。

[軟體工程的觀點]
1.子類別的方法不能直接存取父類別的private成員。
子類別只能透過父類別所提供,由子類別繼承的非private方法,來更改父類別private實體變數的狀態。
2.宣告private實體變數,有助於你測試、偵錯、正確地修改系統。
如果子類別可以存取其父類別的private實體變數,那麼繼承該子類別的類別,亦能存取這個實體變數。
以此方式傳播應為private的實體變數的存取全,資訊隱藏的好處就會消失殆盡。

全站熱搜
創作者介紹
創作者 alex2008 的頭像
alex2008

alex2008的部落格

alex2008 發表在 痞客邦 留言(0) 人氣()