一談到Java,人們馬上會(huì)想起一種類似于C和C++的、適用于分布環(huán)境的面向?qū)ο缶幊陶Z(yǔ)言,想到這種語(yǔ)言的簡(jiǎn)單、穩(wěn)定、安全、與體系結(jié)構(gòu)無(wú)關(guān)、可移植、可解釋、高性能、多線索和動(dòng)態(tài)性等特征。這些都是Java作為一種程序設(shè)計(jì)語(yǔ)言的主要特征。但是,如果希望更好地理解Java語(yǔ)言,最好的方法是把這種語(yǔ)言與其同類型的語(yǔ)言相比較。既然Java類似于C++ ,把它同C++進(jìn)行一番比較則是順理成章的事情。
一、Java語(yǔ)言
Java是由Sun公司的一個(gè)技術(shù)小組研制出來(lái)的。在實(shí)現(xiàn)Java語(yǔ)言的過(guò)程中,小組的技術(shù)人員很快就意識(shí)到:C++無(wú)法成為一種完全面向?qū)ο蟮�、網(wǎng)絡(luò)化的開(kāi)發(fā)語(yǔ)言。C++是通過(guò)給原先的C語(yǔ)言增加面向?qū)ο蠊δ芏_(kāi)發(fā)出來(lái)的,因此,它存在著先天不足。這主要體現(xiàn)在C++種類繁多,功能大量冗余,同時(shí)又沒(méi)有任何一種C++編譯器能夠支持它的全部功能。鑒于這種情況,Sun公司的技術(shù)人員決定不擴(kuò)充C++,而開(kāi)發(fā)一種全新的計(jì)算機(jī)語(yǔ)言(Java的前身Oak)。但是,C++已經(jīng)成了大多數(shù)編程人員所熟練掌握的語(yǔ)言,Java的設(shè)計(jì)顯然不能無(wú)視這個(gè)現(xiàn)實(shí)。如果Java和C++之間的差別 過(guò)大,那么程序員們?cè)趯W(xué)會(huì)這種語(yǔ)言的過(guò)程中無(wú)疑要花費(fèi)大量的時(shí)間和精力。因此,Java保留了盡可能多的C++風(fēng)格。
Java是完全面向?qū)ο蟮?這和C++不盡相同。盡管C++被認(rèn)為是一種面向?qū)ο蟮恼Z(yǔ)言,但它仍然支持過(guò)程式程序設(shè)計(jì)風(fēng)格。Java則不然,它要求程序員采用完全面向?qū)ο蟮木幊碳夹g(shù) ,從而消除了由于混用兩種相同的編程風(fēng)格而導(dǎo)致的種種問(wèn)題。另一方面,Java的"外觀"和 "感覺(jué)"和C++又有著很多相似之處。Java消除了C和C++中的冗余以及所有過(guò)程式的編程風(fēng)格 ,并且不再支持指針數(shù)據(jù)類型,同時(shí)增加了數(shù)組的自動(dòng)邊界檢查和自動(dòng)內(nèi)存垃圾搜集,并且把數(shù)組封裝到類結(jié)構(gòu)內(nèi),從而有助于開(kāi)發(fā)分布計(jì)算環(huán)境下的應(yīng)用程序。
不過(guò),Java之所以能夠成為一種理想的編程語(yǔ)言,最重要的原因還在于其"內(nèi)嵌"的內(nèi)存管理和多線索功能。C++語(yǔ)言支持程序員編寫(xiě)一些非常低級(jí)的程序,從而能夠訪問(wèn)機(jī)器硬件 ,并操縱實(shí)際內(nèi)存地址。但這些是以犧牲可移植性為代價(jià)的,因?yàn)檫@時(shí)每個(gè)程序都是針對(duì)某種具體硬件環(huán)境的。而Java卻是通過(guò)提供各種邊界檢查和內(nèi)存管理來(lái)確保代碼的可移植性 ,同時(shí),還提供了內(nèi)嵌的多線索功能,使類似于內(nèi)存垃圾搜集一類的操作可以在后臺(tái)進(jìn)行,從而保證了較高的執(zhí)行效率。
Java語(yǔ)言能夠具有這些優(yōu)點(diǎn),主要是因?yàn)樗亲鳛橐环N全新的語(yǔ)言而設(shè)計(jì)的。如果僅僅是擴(kuò)充C++,Java將無(wú)法避免C++中遺留的大量過(guò)程式特性,其解釋器的規(guī)模將急劇增長(zhǎng),從而降低了系統(tǒng)的總體性能,代碼的可移植性和穩(wěn)定性的實(shí)現(xiàn)即使是可能的,也將非常困難�?傊�,Java的這些特性,為其成為下一代編程語(yǔ)言奠定了良好的基礎(chǔ)。
1.Java 的面向?qū)ο筇卣?nbsp;
面向?qū)ο蠹夹g(shù)的關(guān)鍵在于封裝、繼承和動(dòng)態(tài)聯(lián)編,下面就談?wù)凧ava是如何支持這些關(guān)鍵特性的。
面向?qū)ο蠹夹g(shù)的基本單位是對(duì)象,對(duì)象在Java中稱為類(Class)。一個(gè)類實(shí)際上就是一段用于實(shí)現(xiàn)對(duì)象行為的代碼,它是提供封裝性的根本所在。也就是說(shuō),對(duì)象及其相關(guān)的所有操作均被封裝到一個(gè)類中。
所有的對(duì)象都有一個(gè)狀態(tài)。類也有狀態(tài),以"實(shí)例變量"表示。實(shí)例變量由相應(yīng)的類進(jìn)行控制,除某些特殊情況外其它任何類都無(wú)法訪問(wèn)這些變量。實(shí)例變量通過(guò)方法(method)進(jìn)行訪問(wèn)。方法相當(dāng)于過(guò)程式語(yǔ)言中的函數(shù),它是一個(gè)可多次調(diào)用的代碼段。程序員必須通過(guò)調(diào)用方法來(lái)實(shí)現(xiàn)對(duì)類的控制,即改變類的狀態(tài),而且只能實(shí)現(xiàn)類的方法所允許的操作。這就是面向?qū)ο蠹夹g(shù)的工作原理。
當(dāng)然,在個(gè)別情況下(對(duì)某些面向?qū)ο蟮恼Z(yǔ)言而言),編程人員也可以直接訪問(wèn)實(shí)例變量 ,但這并不是一個(gè)值得推薦的做法,因?yàn)樗`背了面向?qū)ο蟮某踔浴?nbsp;
面向?qū)ο缶幊痰膬?yōu)點(diǎn)主要在于代碼的可重用性。當(dāng)需要進(jìn)行某些重復(fù)性操作時(shí),編程人員不必反復(fù)地重寫(xiě)相同的代碼段,而只需創(chuàng)建對(duì)象的多個(gè)實(shí)例即可。因?yàn)榫幊倘藛T既不需要了解對(duì)象是如何創(chuàng)建的,也不用知道對(duì)象內(nèi)部的工作機(jī)理,需要知道的只是對(duì)象方法的調(diào)用機(jī)制,其余的工作將由對(duì)象所屬的類進(jìn)行處理。在Java中,程序員可以編寫(xiě)完成各種功能的類,發(fā)布編譯之后的代碼,并且只需要告訴用戶如何控制這些類即可。
Java通過(guò)類來(lái)實(shí)現(xiàn)對(duì)象,并且提供了類的多種用法。類可以作為各對(duì)象實(shí)例的一個(gè)模板。為創(chuàng)建類的新實(shí)例,可以調(diào)用其構(gòu)造函數(shù),它是每當(dāng)創(chuàng)建類的一份新的拷貝時(shí)都必須調(diào)用的一個(gè)特殊方法。當(dāng)一個(gè)類的所有程序都已經(jīng)結(jié)束運(yùn)行,或者Java覺(jué)得不再需要調(diào)用該類時(shí) (比方說(shuō)應(yīng)用程序已經(jīng)結(jié)束),必須調(diào)用這個(gè)類的終結(jié)函數(shù)(finalize),以進(jìn)行一些必要的清除工作。當(dāng)然,Java的終結(jié)函數(shù)和C++中的析構(gòu)函數(shù)會(huì)有所差別,因?yàn)镴ava可進(jìn)行自動(dòng)垃圾清除。
|