引言 “He gave man speech, and speech created thought, Which is the measure of the Universe” —Prometheus Unbound, Shelley 和其它自然語(yǔ)言一樣苛萎,Java是表達(dá)思想的媒介易阳。隨著問(wèn)題規(guī)模的越發(fā)增大、程度的越發(fā)復(fù)雜,憑借自身無(wú)與倫比的靈活性鸿染,Java得以更加輕松地解決實(shí)際問(wèn)題。 記住瞒窒,千萬(wàn)不要將Java僅僅視為各種特性的集合躲惰,這會(huì)使你失去對(duì)它的深入理解。設(shè)計(jì)思維是Java使用者十分重要的思考方式智袭,也是Java的設(shè)計(jì)初衷:讓使用者可以在Java上輕松地設(shè)計(jì)軟件結(jié)構(gòu)奔缠,而非只是用來(lái)進(jìn)行簡(jiǎn)單的編程。毫無(wú)疑問(wèn)吼野,這不僅需要對(duì)語(yǔ)言的熟練運(yùn)用校哎,更需要對(duì)問(wèn)題的透徹理解。 抽象 抽象是編寫(xiě)程序的基礎(chǔ),而問(wèn)題的復(fù)雜程度取決于抽象的質(zhì)量闷哆,良好的抽象結(jié)果有益于問(wèn)題的解決腰奋。在這一點(diǎn)上,早期的組裝式語(yǔ)言和命令式語(yǔ)言(FORTRAN, BASIC, C)做得不夠優(yōu)秀抱怔,因?yàn)槲覀儾坏貌辉诮鉀Q問(wèn)題的過(guò)程中考慮機(jī)器模型與問(wèn)題模型的聯(lián)系劣坊,因?yàn)樵诓煌臋C(jī)器上需要不同的編碼實(shí)現(xiàn),這無(wú)疑增加了編程以及維護(hù)的難度屈留。 當(dāng)然局冰,替代方案總是有的,LISP和ASL使用模型化問(wèn)題替代模型化機(jī)器灌危,將問(wèn)題轉(zhuǎn)化為決策鏈康二。它們提供了另一種觀察問(wèn)題的視角(“所有問(wèn)題都是列表”或“所有問(wèn)題都是算法”),在解決特定類(lèi)型的問(wèn)題上的確效率頗高乍狐,但是一旦踏出那一畝三分地便會(huì)捉襟見(jiàn)肘赠摇。 面向?qū)ο缶幊蹋∣bject-Oriented Programming, OOP)是編程領(lǐng)域的重大改進(jìn),它摒棄了與問(wèn)題毫無(wú)聯(lián)系的機(jī)器部分浅蚪,取而代之的是問(wèn)題的抽象:對(duì)象(Object)。有了對(duì)象烫罩,我們得以從問(wèn)題的角度解決問(wèn)題惜傲,而不是從機(jī)器的角度解決問(wèn)題。同樣贝攒,程序也不再拘泥于只能解決特定領(lǐng)域的問(wèn)題盗誊,而是可以解決更加通用的問(wèn)題。但是這不代表OOP與計(jì)算機(jī)毫無(wú)關(guān)聯(lián)隘弊。我們可以將每個(gè)對(duì)象都視為一臺(tái)計(jì)算機(jī)哈踱,它們有狀態(tài)、動(dòng)作梨熙,你可以發(fā)送指令操作它們开镣。 面向?qū)ο缶幊叹哂形鍌€(gè)特征: 1.萬(wàn)物皆對(duì)象 2.程序本質(zhì)上是許多對(duì)象互相通信的過(guò)程 3.任何對(duì)象都是其它對(duì)象的組合 4.任何對(duì)象都有類(lèi)型 5.同一類(lèi)型的對(duì)象接收同樣的信息 簡(jiǎn)單地說(shuō),對(duì)象擁有狀態(tài)咽扇、行為邪财、身份。狀態(tài)來(lái)自于內(nèi)部的數(shù)據(jù)质欲,行為由方法產(chǎn)生树埠,身份(多數(shù)情況下可以認(rèn)為是內(nèi)存地址)用來(lái)將每個(gè)對(duì)象區(qū)分開(kāi)。 接口 我們所說(shuō)的“類(lèi)”最早來(lái)源于亞里士多德對(duì)物種種類(lèi)(type)的研究嘶伟,在其中他首次使用“魚(yú)類(lèi)”和“鳥(niǎo)類(lèi)”的稱呼怎憋。類(lèi)中包含具有相同特征與行為的對(duì)象,對(duì)象可以屬于不同的類(lèi)。編程語(yǔ)言中的關(guān)鍵字class便代表了類(lèi)(盡管實(shí)際上我們創(chuàng)建的是新的數(shù)據(jù)種類(lèi)(type)绊袋,但所有OOP語(yǔ)言都使用class而不是type作為關(guān)鍵字)毕匀。在程序運(yùn)行期間,除了各自的狀態(tài)愤炸,類(lèi)中成員彼此完全相同期揪。可以說(shuō)规个,將實(shí)體抽象成類(lèi)是面向?qū)ο缶幊套罨镜牟襟E凤薛。 類(lèi)被創(chuàng)建后,我們便可以創(chuàng)建并操作對(duì)象诞仓,但是問(wèn)題也隨之而來(lái):如何在問(wèn)題和對(duì)象之間建立一對(duì)一的聯(lián)系缤苫?怎樣讓對(duì)象做出恰當(dāng)?shù)男袨椋匡@然墅拭,對(duì)象只會(huì)對(duì)特定的請(qǐng)求做出回應(yīng)活玲,我們稱這樣的請(qǐng)求為接口(interface),而決定接口的則是種類(lèi)(type)谍婉。接口里面需要有具體代碼舒憾,這些代碼加上對(duì)象中的隱藏?cái)?shù)據(jù)統(tǒng)稱為實(shí)現(xiàn)(implementation)。下面用電燈泡作為一個(gè)例子: 如圖所示穗熬,類(lèi)名是Light镀迂,對(duì)象是lt,其中包含的方法可以讓它打開(kāi)唤蔗、關(guān)閉探遵、變亮、變暗妓柜。通過(guò)使用關(guān)鍵字new箱季,我們得以創(chuàng)建對(duì)象,注意這里創(chuàng)建的是指向?qū)ο蟮囊霉髌玫拿质?strong>lt藏雏。對(duì)象的方法通過(guò)在對(duì)象名后添加逗點(diǎn)(.)來(lái)操作,這與面向過(guò)程編程的語(yǔ)法類(lèi)似塌衰。 上圖中間包含類(lèi)名和方法名的方塊稱為統(tǒng)一建模語(yǔ)言(Unified Modeling Language, UML)诉稍。在最上面方塊內(nèi)的是類(lèi)名,中間方塊內(nèi)的是數(shù)據(jù)成員名最疆,最下面方塊內(nèi)的是方法名杯巨。通常情況下,只有類(lèi)名和public方法表示在UML中努酸。當(dāng)然如果僅僅需要類(lèi)名服爷,方法名部分也可以省略。