本篇文章主要介紹Java平臺(tái)無(wú)關(guān)性的內(nèi)容,將詳細(xì)地回答為什么Java要支持平臺(tái)無(wú)關(guān)性?Java是如何支持平臺(tái)無(wú)關(guān)性?影響的因素有哪一些?以及Java是如何實(shí)現(xiàn)平臺(tái)無(wú)關(guān)性的。
為什么Java要支持平臺(tái)無(wú)關(guān)性
眾所周知,Java是平臺(tái)無(wú)關(guān)的語(yǔ)言,那么Java為什么要支持平臺(tái)無(wú)關(guān)性,總結(jié)一下,有如下幾點(diǎn)
- 支持多變的網(wǎng)絡(luò)環(huán)境。如今是一個(gè)互聯(lián)網(wǎng)的時(shí)代,網(wǎng)絡(luò)將各種各樣的計(jì)算機(jī)和設(shè)備連接起來(lái),比如網(wǎng)絡(luò)連接了windows的PC機(jī),UNIX工作站等等。為了保證程序能夠不加任何修改運(yùn)行于網(wǎng)絡(luò)上的任何計(jì)算機(jī),而不管計(jì)算機(jī)是什么種類(lèi),什么平臺(tái),這樣就極大減輕了系統(tǒng)管理員的工作。尤其是程序是通過(guò)網(wǎng)絡(luò)環(huán)境進(jìn)行部署的。
- 支持網(wǎng)絡(luò)化嵌入式設(shè)備。目前工作場(chǎng)所中存在各種各樣的嵌入式設(shè)備,比如打印機(jī),掃描儀,傳真機(jī)等。他們往往通過(guò)網(wǎng)絡(luò)連接起來(lái),甚至在家庭網(wǎng)絡(luò)和汽車(chē)內(nèi)部也存在這樣那樣的嵌入式設(shè)備 。Java的平臺(tái)無(wú)關(guān)性可以簡(jiǎn)化這樣的系統(tǒng)管理任務(wù)。無(wú)論是哪個(gè)網(wǎng)絡(luò)的管理員,它只需關(guān)注程序本身即可。此外添加一臺(tái)新設(shè)備,可以立即被其他設(shè)備訪問(wèn)到,也可以訪問(wèn)其他設(shè)備。這都是平臺(tái)無(wú)關(guān)性帶來(lái)的好處。
- 減少開(kāi)發(fā)者部署程序的成本和時(shí)間。
對(duì)于開(kāi)發(fā)者而言, Java平臺(tái)無(wú)關(guān)的能力給予網(wǎng)絡(luò)一個(gè)同構(gòu)的運(yùn)行環(huán)境,使得分布式系統(tǒng)可以圍繞著“網(wǎng)絡(luò)移動(dòng)對(duì)象”開(kāi)構(gòu)建。比如對(duì)象序列化,RMI, Jini就是利用平臺(tái)無(wú)關(guān)性。把面向?qū)ο缶幊虖奶摂M機(jī)帶到了網(wǎng)絡(luò)上。
Java如何支持平臺(tái)無(wú)關(guān)性
Java從四個(gè)方面支持了平臺(tái)無(wú)關(guān)性
- 最主要的是Java平臺(tái)本身。Java平臺(tái)扮演Java程序和所在的硬件與操作系統(tǒng)之間的緩沖角色。這樣Java程序只需要與Java平臺(tái)打交道,而不用管具體的操作系統(tǒng)。
- Java語(yǔ)言保證了基本數(shù)據(jù)類(lèi)型的值域和行為都是由語(yǔ)言自己定義的。而C/C++中,基本數(shù)據(jù)類(lèi)是由它的占位寬度決定的,占位寬度由所在平臺(tái)決定的。不同平臺(tái)編譯同一個(gè)C++程序會(huì)出現(xiàn)不同的行為。通過(guò)保證基本數(shù)據(jù)類(lèi)型在所有平臺(tái)的一致性,Java語(yǔ)言為平臺(tái)無(wú)關(guān)性提供強(qiáng)有力的支持。
- Java class文件。Java程序最終會(huì)被編譯成二進(jìn)制class文件。class文件可以在任何平臺(tái)創(chuàng)建,也可以被任何平臺(tái)的Java虛擬機(jī)裝載運(yùn)行。它的格式有著嚴(yán)格的定義,是平臺(tái)無(wú)關(guān)的。
- 可伸縮性。Sun通過(guò)改變API的方式得到三個(gè)基礎(chǔ)API集合,表現(xiàn)為Java平臺(tái)不同的伸縮性:J2EE,J2SE,J2ME。
影響Java平臺(tái)無(wú)關(guān)性的因素
- Java平臺(tái)的部署。運(yùn)行Java程序之前,必須要部署好Java平臺(tái)。
- Java平臺(tái)的版本。Sun公司提供了不同的API集合,有標(biāo)準(zhǔn)版,擴(kuò)展版等等。此外API本身也面臨著改動(dòng),一些API被認(rèn)為是過(guò)期的,一些API甚至不向下兼容,因此我們需要選擇合適的Java平臺(tái)版本支持程序開(kāi)發(fā)。
- 本地方法。當(dāng)編寫(xiě)一個(gè)平臺(tái)獨(dú)立的Java程序時(shí)候,最重要的原則是:不要直接或間接調(diào)用不屬于Java API的本地方法。調(diào)用Java API以外的本地方法使得程序平臺(tái)相關(guān)。一般而言,本地方法在三種情況適用:使用底層主機(jī)平臺(tái)的特性,而Java API無(wú)法訪問(wèn);為了訪問(wèn)老系統(tǒng)或者使用現(xiàn)有的庫(kù),但是這個(gè)系統(tǒng)或庫(kù)不是Java編寫(xiě)的;為了加快程序性能,將時(shí)間敏感代碼用本地方法實(shí)現(xiàn)。因此當(dāng)必須使用本地方法,而且支持多種平臺(tái)運(yùn)行,必須將本地方法移植到所有需要的平臺(tái)上。因此編寫(xiě)平臺(tái)獨(dú)立的Java程序做主要的目的就是完全禁止本地方法,通過(guò)Java API和主機(jī)交互。
- 非標(biāo)準(zhǔn)運(yùn)行時(shí)庫(kù)。所謂平臺(tái)無(wú)關(guān)性,一種解釋是你調(diào)用的方法是否在任何地方都已經(jīng)實(shí)現(xiàn)。本地方法顧名思義,就是只是在本地實(shí)現(xiàn)了,所以無(wú)法保證平臺(tái)無(wú)關(guān)。而Java API在如windows, Solaris等操作系統(tǒng)上的實(shí)現(xiàn)上使用了本地方法訪問(wèn)主機(jī),即保證了平臺(tái)無(wú)關(guān)。
- 對(duì)虛擬機(jī)的依賴(lài)。虛擬機(jī)可以由不同開(kāi)發(fā)商開(kāi)發(fā),但是必須滿(mǎn)足如下兩條原則:不要依賴(lài)及時(shí)終結(jié)(finalization)保證程序的正確性,因?yàn)樘囟ǔ绦蛑袑?duì)象可能在不同的時(shí)間被垃圾收集;不要依賴(lài)線程的優(yōu)先級(jí)來(lái)保證程序的正確性。因?yàn)橐恍┨摂M機(jī)可以實(shí)現(xiàn)優(yōu)先級(jí)高線程優(yōu)先運(yùn)行,一些虛擬機(jī)不能保證這一點(diǎn)。
- 對(duì)用戶(hù)界面依賴(lài),AWT庫(kù)提供基本的用戶(hù)界面,這些組件被映射成每個(gè)平臺(tái)上的本地組件,而Swing庫(kù)為用戶(hù)提供更高級(jí)的組件,但并沒(méi)有被映射為本地組件。
實(shí)現(xiàn)平臺(tái)無(wú)關(guān)的7大步驟
- 選擇程序運(yùn)行的主機(jī)和設(shè)備集合(目標(biāo)宿主機(jī))
- 在目標(biāo)宿主機(jī)中選擇Java平臺(tái)版本。
- 對(duì)于每個(gè)目標(biāo)宿主機(jī),選擇程序?qū)⒁\(yùn)行的Java平臺(tái)實(shí)現(xiàn)(目標(biāo)運(yùn)行時(shí)環(huán)境)。
- 編寫(xiě)程序,調(diào)用Java API標(biāo)準(zhǔn)運(yùn)行庫(kù)(不調(diào)用本地方法,或者專(zhuān)門(mén)開(kāi)發(fā)商專(zhuān)門(mén)調(diào)用本地方法的庫(kù))
- 編寫(xiě)程序,不依賴(lài)于垃圾收集器收集垃圾時(shí)間,不依賴(lài)線程的優(yōu)先級(jí)
- 努力設(shè)計(jì)用戶(hù)界面,在所有的目標(biāo)宿主機(jī)都能正常工作
- 在所有目標(biāo)運(yùn)行時(shí)環(huán)境和所有目標(biāo)宿主機(jī)進(jìn)行測(cè)試
本篇文章關(guān)于Java平臺(tái)無(wú)關(guān)性的內(nèi)容就介紹到此結(jié)束了,想要了解更多關(guān)于Java特性的內(nèi)容,請(qǐng)關(guān)注W3Cschool其它相關(guān)文章!