第一章:對(duì)象簡(jiǎn)介
對(duì)象有狀態(tài)、行為、標(biāo)識(shí)。
類與數(shù)據(jù)類型區(qū)別:
類實(shí)際上是一種數(shù)據(jù)類型。它們的區(qū)別在于:類是程序員為解決特定問(wèn)題而定做的,而數(shù)據(jù)類型是為了表示機(jī)器的存儲(chǔ)單元而設(shè)計(jì)的,它是現(xiàn)成的,是程序員無(wú)可奈何時(shí)的選擇。
面向?qū)ο缶幊痰奶魬?zhàn)之一就是:如何在問(wèn)題空間的元素與解決空間的對(duì)象之間建立一種一對(duì)一的映射。
可以向每個(gè)對(duì)象發(fā)送請(qǐng)求,這樣才能讓對(duì)象為你解決問(wèn)題,但每個(gè)對(duì)象只能滿足某些請(qǐng)求,具體能夠滿足哪些請(qǐng)求呢?這是由對(duì)象的
接口(interface)所定義的。決定接口的是對(duì)象的類型。接口只管你能向?qū)ο蟀l(fā)送什么請(qǐng)求,但還必須要有滿足這一請(qǐng)求的代碼,這些代碼以及隱藏著的數(shù)據(jù),組成了
實(shí)現(xiàn)(implementation)
將對(duì)象做為服務(wù)的提供者
隱藏實(shí)現(xiàn):將程序分為類的創(chuàng)造者(class creator)和客戶程序員(client programmer).訪問(wèn)控制符:public,private,protected.public表示后面跟著的東西誰(shuí)都能用。而private表示除非是類的創(chuàng)建者用這個(gè)類的方法進(jìn)行訪問(wèn),否則沒人能訪問(wèn)到這個(gè)元素。protected很像private,它們的區(qū)別在于,繼承類能夠訪問(wèn) protected成員但是不能訪問(wèn)private成員。Java還有一個(gè)“缺省”的訪問(wèn)權(quán)限。通常稱為package訪問(wèn)權(quán)限。國(guó)為同屬這個(gè) package的類可以訪問(wèn)這個(gè)package中其它類的“缺省權(quán)限”的成員。但是出了這個(gè)package,它們就都是private的了。
復(fù)用實(shí)現(xiàn)(合成):在一個(gè)類中用另一個(gè)類創(chuàng)建對(duì)象,為了能讓新的類提供我所設(shè)計(jì)的功能,它可以由任意多個(gè),任意類型的對(duì)象,以任意形式組合在一起。由于你是用已有的類來(lái)合成新的類,因此這一概念被稱為合成。如果這個(gè)對(duì)象是動(dòng)態(tài)合成的,通常稱為聚合。通常交合成稱為“有(has-a )"關(guān)系。
繼承:(復(fù)用接口)當(dāng)你繼承一個(gè)類時(shí),你也創(chuàng)建了一個(gè)新類,這個(gè)新的類不僅包含了已有類的所有成員,更重要的是它復(fù)制了基類的接口,于是所有能夠傳給基類的消息也都可以傳給派生類。
你有兩種辦法來(lái)區(qū)分新的派生出來(lái)的類和那個(gè)原來(lái)的基類。第一種方法很簡(jiǎn)單:直接往派生類里加新的方法。這些新的方法不屬于基類的接口。也就是說(shuō)由于基類不能完成所有的工作,你必須加上更多的方法。第二種方法是在新的類中修改基類方法的行為,這被稱為覆寫(override)那個(gè)方法。要覆寫一個(gè)方法直接在類中重新定義這個(gè)方法就行了。
多態(tài)性:多態(tài)性指的是相關(guān)的對(duì)象按照各自類型來(lái)實(shí)現(xiàn)方法的能力。繼承性指的就是派生類(子類)繼承抽象類(基類、父類),它是一種類特殊化的方式,用于聯(lián)系派生類和抽象類。在這里我把這兩個(gè)特點(diǎn)一起舉例說(shuō)明一下。在魔獸里,四個(gè)種族都有農(nóng)民,而且屬性和方法基本一樣,那我們就可以為農(nóng)民這個(gè)概念設(shè)置一個(gè)基類,然后將每族農(nóng)民設(shè)為一個(gè)子類。每個(gè)子類方法的類型可能不一樣。在運(yùn)行時(shí),通過(guò)判定對(duì)象所屬的類型再去執(zhí)行相應(yīng)類型所對(duì)應(yīng)的方法的。所以多態(tài)性與繼承是緊密關(guān)聯(lián)的。
抽象類與接口(abstrcat與interface): 通常在有些設(shè)計(jì)方案中,你只想讓基類去表示由其派生出的類的接口。也就是你不想讓人創(chuàng)建一個(gè)基類的對(duì)象,而只是想把對(duì)象上傳給它,以期能使用這個(gè)類的接口。這樣你就需要使用abstract關(guān)鍵詞來(lái)把這個(gè)類做成抽象類。編譯器會(huì)阻止任何人創(chuàng)建abstrcat的對(duì)象。abstrcat 關(guān)鍵詞也可以用來(lái)表示這個(gè)方法還沒有實(shí)現(xiàn)--它就象是一個(gè)聲明”由這個(gè)類所派生出的所有類都有這個(gè)方法,但是它的實(shí)現(xiàn)不在這里“。abstrcat方法只能存在于abstrcat類里。如果有個(gè)類繼承了這個(gè)abstrcat類,那么它要么實(shí)現(xiàn)這個(gè)方法,要么也是一個(gè)abstrcat類。abstrcat方法能讓你將方法放到接口而不必為它寫一些無(wú)意義的代碼。interface關(guān)鍵詞更是對(duì)abstrcat類的概念的深化,它不允許你實(shí)現(xiàn)任何方法。如果你愿意你可以繼承多個(gè)接口,因?yàn)橐^承多個(gè)常規(guī)或是抽象類是不允許的。