6:復(fù)用類
合成所使用的語(yǔ)法
如果想對(duì)reference進(jìn)行初始化,那么可以在以下幾個(gè)時(shí)間進(jìn)行:
1。在定義對(duì)象的時(shí)候。這就意味著在構(gòu)造函數(shù)調(diào)用之前,它們已經(jīng)初始化完畢了。
2。在這個(gè)類的構(gòu)造函數(shù)里。
3。在即將使用那個(gè)對(duì)象之前。這種做法通常被成為“偷懶初始化(lazy initialization)”。如果碰到創(chuàng)建對(duì)象的代價(jià)很高,或者不是每次都需要?jiǎng)?chuàng)建對(duì)象的時(shí)候,這種做法就能降低程序的開(kāi)銷了。
繼承所使用的語(yǔ)法。
繼承設(shè)計(jì)方面有一條通用準(zhǔn)則,那就是把數(shù)據(jù)都設(shè)成private的,把方法都設(shè)成public的。當(dāng)然碰到特殊情況還要調(diào)整,但是這還是一條非常有用的準(zhǔn)則。
基類的初始化
構(gòu)造行為是從積累“向外”發(fā)展的,所以基類會(huì)在派生類的構(gòu)造函數(shù)訪問(wèn)它之前先進(jìn)行初始化。
帶參數(shù)的構(gòu)造函數(shù)
對(duì)派生類構(gòu)造函數(shù)而言,調(diào)用基類的構(gòu)造函數(shù)應(yīng)該是它做的第一件事。
捕獲積累構(gòu)造函數(shù)拋出的異常。
把合成和繼承結(jié)合起來(lái)
雖然編譯器會(huì)強(qiáng)制你對(duì)基類進(jìn)行初始化,并且會(huì)要求你在構(gòu)造函數(shù)的開(kāi)始部分完成初始化。但是它不會(huì)檢查你是不是進(jìn)行了成員對(duì)象的初始化,因此你只能自己留神了。
確保進(jìn)行妥善地清理
先按照創(chuàng)建對(duì)象的相反順序進(jìn)行類的清理。然后調(diào)用基類的清理方法。
名字的遮蓋
用合成還是繼承
繼承要表達(dá)的是一種“是(is-a)”關(guān)系,而合成要表達(dá)的是“有(has-s)”關(guān)系。
protected
Java的protected也提供package的權(quán)限。
漸進(jìn)式的開(kāi)發(fā)
上傳(upcasting):總是安全的。
合成還是繼承,再探討。
final關(guān)鍵詞
Final的數(shù)據(jù)
對(duì)primitive來(lái)說(shuō),final會(huì)將這個(gè)值定義成常量,但是對(duì)于對(duì)象的reference而言,final的意思則是這個(gè)reference是常量。Java沒(méi)有提供將某個(gè)對(duì)象作成常量的方法。這種局限性也體現(xiàn)在數(shù)組上,因?yàn)樗彩且粋€(gè)對(duì)象。
空白的final數(shù)據(jù)(Blank finals)
一定得為final數(shù)據(jù)賦值,要么是在定義數(shù)據(jù)的時(shí)候用一個(gè)表達(dá)式賦值,要么是在構(gòu)造函數(shù)里面進(jìn)行賦值。
Final的參數(shù)
Java允許你在參數(shù)表中生命參數(shù)是final的,你不能在方法里讓參數(shù)reference指向另一個(gè)對(duì)象。
Final方法
final和private
private方法都隱含有final的意思。
Final類
不允許別人去繼承。
小心使用final
初始化與類的裝載
繼承情況下的初始化
總結(jié):本章主要講述了繼承和合成的概念和用法及一些注意事項(xiàng)。盡管面向?qū)ο蟮淖兂蓵?huì)反復(fù)強(qiáng)調(diào)繼承,但是當(dāng)你著手設(shè)計(jì)的時(shí)候,通唱情況下還是應(yīng)該先考慮合成,只有在必要的時(shí)候才使用繼承。合成會(huì)更靈活。
2005年03月12日 3:42 AM