本篇博客是Java web入門的第一篇博客撩鹿,這篇博客主要講述java語(yǔ)言的一些簡(jiǎn)介浪读。
? 一)先從Java語(yǔ)言的誕生說(shuō)起流译。
? 1991年封字,Sun公司在一個(gè)叫做James Gosling的人的帶領(lǐng)下黔州,成立了一個(gè)項(xiàng)目組,名字叫做“Green”阔籽。當(dāng)時(shí)這個(gè)項(xiàng)目組成立的時(shí)候流妻,是計(jì)劃開發(fā)一種能夠運(yùn)行在消費(fèi)性電子設(shè)備上的編程語(yǔ)言。這種設(shè)備的特點(diǎn)是:1笆制、運(yùn)算能力和運(yùn)算空間非常有限绅这;2、不同的廠商設(shè)計(jì)產(chǎn)品時(shí)會(huì)使用完全不同的CPU在辆,因此會(huì)有完全不同的架構(gòu)证薇。為了解決這個(gè)問(wèn)題,當(dāng)時(shí)Green希望設(shè)計(jì)出一種具有非常優(yōu)秀的“跨平臺(tái)”特性的語(yǔ)言匆篓。1992年浑度,Green項(xiàng)目組最初的產(chǎn)品誕生。這個(gè)產(chǎn)品一開始被稱之為“Oak”鸦概,但是后來(lái)發(fā)現(xiàn)箩张,Oak已經(jīng)是另外一種計(jì)算機(jī)語(yǔ)言的名字。于是窗市,Oak語(yǔ)言更名為Java語(yǔ)言先慷。
? ?1996年,Java語(yǔ)言發(fā)布了第一個(gè)正式版本:1.0版本谨设。這時(shí)熟掂,Java語(yǔ)言能夠編寫的程序稱之為Applet。這種Applet只能在集成了Java環(huán)境的瀏覽器中運(yùn)行扎拣,當(dāng)時(shí)主要為瀏覽器來(lái)增加各種動(dòng)態(tài)效果赴肚,用來(lái)美化頁(yè)面和增強(qiáng)用戶與瀏覽器的交互素跺。很快的,1.1版本發(fā)布誉券。這個(gè)版本修正了1.0版本中大量的bug指厌, 并完善了1.0版本中的很多缺失的部分。1998年12月踊跟,Java1.2版本發(fā)布踩验。為了表明這是一個(gè)非常重大的更新,Sun公司把Java1.2版本商玫,也稱之為Java 2 Platform箕憾,來(lái)表示這是一個(gè)全新的Java平臺(tái)。對(duì)1.0和1.1擴(kuò)展之后得到的部分稱之為“標(biāo)準(zhǔn)版”拳昌,也就是所謂的“Java 2 Standard Edition”袭异,簡(jiǎn)稱“J2SE”。標(biāo)準(zhǔn)版可以用來(lái)寫Applet炬藤,也可以用來(lái)編寫脫離瀏覽器御铃,獨(dú)立運(yùn)行的程序(Application)。除了標(biāo)準(zhǔn)版之外沈矿,Java 2還包括“企業(yè)版”(J2EE)和“微型版”(J2ME)上真。企業(yè)版主要提供了服務(wù)器端編程的功能,而微型版主要提供了在一些資源受限制的平臺(tái)上(例如手機(jī))運(yùn)行Java的功能羹膳。之后睡互,Java語(yǔ)言發(fā)布了1.3和1.4版本。這兩個(gè)版本主要修正了bug溜徙,完善了Java的類庫(kù)湃缎。2004年,Java推出了一個(gè)新版本蠢壹。這個(gè)版本是 1.1之后,Java第一次對(duì)語(yǔ)言的基礎(chǔ)類庫(kù)做出重大改進(jìn)的版本九巡。Sun公司把這個(gè)版本稱之為5.0图贸。這也就意味著,這個(gè)版本與原來(lái)的Java 2平臺(tái)相比有著很多不同的地方冕广,而原來(lái)的三個(gè)平臺(tái):J2SE疏日、J2EE、J2ME也被改名成為了Java SE撒汉、 Java EE沟优、Java ME。
那么睬辐,Java語(yǔ)言究竟有什么特性挠阁,能夠在眾多語(yǔ)言中脫穎而出呢宾肺??
? ?1)純面向?qū)ο?/p>
? 相對(duì)于另一種面向?qū)ο蟮恼Z(yǔ)言C++,Java語(yǔ)言是一種非常純粹的面向?qū)ο蟮恼Z(yǔ)言侵俗。對(duì)于C++而言锨用,寫程序除了可以使用面向?qū)ο蟮姆绞街猓€可以采用面向過(guò)程隘谣、面向模板等多種方式增拥;而相對(duì)的,Java語(yǔ)言只能采用面向?qū)ο蟮姆绞竭M(jìn)行編程寻歧。
? 2)簡(jiǎn)單 VS 復(fù)雜
? 由于Java語(yǔ)言相對(duì)C++來(lái)說(shuō)是一種純粹的面向?qū)ο蟮恼Z(yǔ)言掌栅,因此Java語(yǔ)言在理解和學(xué)習(xí)方面,都要比C++語(yǔ)言更簡(jiǎn)單码泛。Java的簡(jiǎn)單性渣玲,指的是Java語(yǔ)言的這種特點(diǎn):1、Java語(yǔ)言本身的特點(diǎn)非常簡(jiǎn)單弟晚,沒(méi)有復(fù)雜和晦澀的語(yǔ)法細(xì)節(jié)忘衍;2、Java語(yǔ)言傾向于讓程序員能夠簡(jiǎn)潔清晰的完成任務(wù)卿城。 而Java語(yǔ)言同時(shí)也是復(fù)雜的枚钓,體現(xiàn)在:1、雖然Java語(yǔ)言本身非常簡(jiǎn)單瑟押,但是它有大量強(qiáng)大而扎實(shí)的類庫(kù)搀捷,這些類庫(kù)極大的豐富了Java語(yǔ)言的特性;2多望、Java語(yǔ)言最主要的陣地是企業(yè)級(jí)應(yīng)用嫩舟,這種應(yīng)用本身,由于涉及到多線程怀偷、分布式送讲、數(shù)據(jù)庫(kù)、網(wǎng)絡(luò)等各種各樣的領(lǐng)域仰挣,Java語(yǔ)言也提供了各種對(duì)應(yīng)的特性翘簇,因此從這個(gè)角度來(lái)看,Java語(yǔ)言是復(fù)雜的维蒙。
? 3)開放性
? Java語(yǔ)言是一種開放的語(yǔ)言:Sun公司已經(jīng)對(duì)Java語(yǔ)言開源掰吕,任何人都可以讀到Java語(yǔ)言的代碼;并且任何程序員都可以對(duì)Java語(yǔ)言未來(lái)的發(fā)展提出自己的開發(fā)和建議÷現(xiàn)在殖熟,Java社區(qū)有大量開源、免費(fèi)的東西可供下載和使用斑响,這在一定程度上也幫助了Java語(yǔ)言的發(fā)展和推廣菱属。
? 4)跨平臺(tái)性
? ? 運(yùn)行Java可以在各種平臺(tái)上面钳榨,包括常見的Windows系統(tǒng),也包括企業(yè)級(jí)應(yīng)用需要的Unix系統(tǒng)照皆。這種在不同平臺(tái)下運(yùn)行的能力使Java語(yǔ)言在企業(yè)級(jí)應(yīng)用中有著深遠(yuǎn)的影響重绷。
二)下面介紹Java語(yǔ)言的運(yùn)行機(jī)制。
? 直接操作計(jì)算機(jī)指令膜毁,使用的是機(jī)器語(yǔ)言以及匯編語(yǔ)言昭卓。但是,對(duì)于程序員來(lái)說(shuō)瘟滨,直接使用匯編語(yǔ)言來(lái)編寫程序候醒,開發(fā)起來(lái)非常的慢,也非常的辛苦杂瘸。所以出現(xiàn)了計(jì)算機(jī)高級(jí)語(yǔ)言倒淫。所謂的計(jì)算機(jī)高級(jí)語(yǔ)言,實(shí)際上指的:人為的規(guī)定一些語(yǔ)法败玉。然后敌土,在遵循這些語(yǔ)法的前提下,寫出一個(gè)文本文件运翼,最后利用某種方式返干,把文本文件轉(zhuǎn)化為機(jī)器指令進(jìn)行執(zhí)行。我們現(xiàn)在所謂的編程血淌,往往指的就是編寫文本文件的這個(gè)部分矩欠。這個(gè)文本文件一般我們稱之為源文件。那么悠夯,應(yīng)當(dāng)如何把一個(gè)源文件轉(zhuǎn)化為機(jī)器指令進(jìn)行執(zhí)行呢癌淮?在現(xiàn)代計(jì)算機(jī)語(yǔ)言中,主要有兩種方式:一種是編譯型沦补,一種是解釋型乳蓄。編譯型語(yǔ)言指的是,通過(guò)一個(gè)編譯器軟件策彤,把源文件轉(zhuǎn)化為可執(zhí)行文件栓袖。可執(zhí)行文件的內(nèi)容店诗,就是一些機(jī)器指令,以及相關(guān)的一些數(shù)據(jù)音榜。在Windows中庞瘸,可執(zhí)行文件往往以.exe作為后綴名。在執(zhí)行程序的時(shí)候赠叼,不需要源代碼文件擦囊,只需要可執(zhí)行文件即可违霞。示意如下:
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?源文件 -- 編譯器--> 可執(zhí)行文件運(yùn)行可執(zhí)行文件 --> 機(jī)器指令
? 與編譯型語(yǔ)言相對(duì)的是解釋型語(yǔ)言。解釋型語(yǔ)言需要一個(gè)解釋器軟件瞬场,這個(gè)軟件會(huì)讀源文件买鸽,在讀文件的過(guò)程中,同時(shí)完成將源文件內(nèi)容翻譯成機(jī)器指令以及執(zhí)行的過(guò)程贯被。換句話說(shuō)眼五,解釋器將讀取源文件、翻譯成機(jī)器指令彤灶、執(zhí)行指令這三步同時(shí)完成看幼。示意如下:
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?文本文件 --解釋器--> 直接翻譯成機(jī)器指令
? 由上可知,編譯型語(yǔ)言在將源文件編譯成可執(zhí)行文件之后幌陕,運(yùn)行程序只需要可執(zhí)行文件诵姜,不再需要重復(fù)編譯的過(guò)程。而解釋型語(yǔ)言每次運(yùn)行時(shí)必須重復(fù)翻譯源文件搏熄,因此從運(yùn)行效率上來(lái)說(shuō)棚唆,解釋型語(yǔ)言遠(yuǎn)遠(yuǎn)不如編譯型語(yǔ)言。當(dāng)然心例,解釋型語(yǔ)言也有自己的優(yōu)勢(shì):跨平臺(tái)性較好宵凌。由于編譯型語(yǔ)言運(yùn)行時(shí)只需要可執(zhí)行文件,而可執(zhí)行文件又與平臺(tái)緊密相連契邀,這也就意味著摆寄,對(duì)于不同的平臺(tái),必須要有不同的可執(zhí)行文件才行坯门。而相對(duì)而言微饥,解釋型語(yǔ)言對(duì)于不同的平臺(tái),只需要有不同的解釋器就可以了古戴,源代碼幾乎不用進(jìn)行修改欠橘。而 Java語(yǔ)言,則兼具有編譯型和解釋型兩種語(yǔ)言的特點(diǎn):Java語(yǔ)言運(yùn)行時(shí)现恼,采用的是先編譯肃续、后解釋的方式運(yùn)行。首先叉袍,Java源代碼要寫在后綴名為.java的源文件中始锚。然后,通過(guò)一個(gè)編譯器喳逛,編譯生成.class文件瞧捌,這個(gè)文件被稱為“二進(jìn)制字節(jié)碼文件”。而.class文件并不能夠直接在機(jī)器上執(zhí)行。執(zhí)行.class文件姐呐,需要一個(gè)解釋器殿怜,這個(gè)解釋器會(huì)把.class中的指令翻譯成真正機(jī)器上的指令。也就是說(shuō)曙砂,需要解釋執(zhí)行.class文件头谜。 示意如下:
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? .java源文件 -- 編譯 --> .class字節(jié)碼文件 -- 解釋執(zhí)行 --> 真正的機(jī)器指令
字節(jié)碼文件是平臺(tái)中立的,也就是說(shuō)鸠澈,運(yùn)行在不同平臺(tái)上的.class文件內(nèi)容相同柱告,與所在平臺(tái)無(wú)關(guān)。
??那么.class文件中保存的是什么內(nèi)容呢款侵?這個(gè)文件中保存的也是計(jì)算機(jī)指令末荐,所不同的是,這些計(jì)算機(jī)指令不是真實(shí)計(jì)算機(jī)所擁有的指令新锈,而是一些虛擬的指令甲脏。在解釋執(zhí)行.class文件的指令時(shí),為了能讓這些虛擬的計(jì)算機(jī)指令能夠轉(zhuǎn)換成真正的計(jì)算機(jī)指令妹笆,我們需要一個(gè)Java虛擬機(jī)(Java Virtual Machine块请,簡(jiǎn)稱 JVM)。JVM事實(shí)上是一個(gè)軟件,這個(gè)軟件為Java程序模擬出一個(gè)統(tǒng)一的運(yùn)行環(huán)境拳缠。Java程序只需要適應(yīng)這個(gè)虛擬的環(huán)境墩新,而與底層真正的硬件環(huán)境及操作系統(tǒng)環(huán)境無(wú)關(guān)。換句話說(shuō)窟坐,JVM的作用在于海渊,它屏蔽了底層不同平臺(tái)的差異。Java虛擬機(jī)接收.class文件中的虛擬指令哲鸳,這些指令很類似于真正的匯編語(yǔ)言指令臣疑,但這些指令與底層的操作系統(tǒng)平臺(tái)和硬件平臺(tái)無(wú)關(guān),完全是另外設(shè)計(jì)出的一套獨(dú)立體系徙菠。而不同平臺(tái)下的Java虛擬機(jī)讯沈,在執(zhí)行時(shí),會(huì)把.class文件中的虛擬機(jī)指令翻譯成對(duì)應(yīng)平臺(tái)上真正的計(jì)算機(jī)指令婿奔。因此缺狠,我們可以修改上面的示意如下:
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? .java源文件 -- 編譯 --> .class字節(jié)碼文件 –在JVM中解釋執(zhí)行--> 真正的機(jī)器指令
Java 語(yǔ)言這種“先編譯,后解釋”的運(yùn)行機(jī)制萍摊,使得其同時(shí)擁有了編譯型語(yǔ)言的高效性和解釋型語(yǔ)言的跨平臺(tái)性挤茄。
? 三)JRE 與 JDK
? ?JRE,也就是Java Runtime Environment的縮寫冰木,指的是Java的運(yùn)行環(huán)境驮樊。包括JVM和Java解釋器。但是僅僅有JRE片酝,只能是完成從.class文件到真正的機(jī)器指令這一步囚衔,而無(wú)法把一個(gè)源文件編譯成一個(gè).class 文件。
JDK雕沿,指的是Java Development Kit练湿,Java開發(fā)工具包。從內(nèi)容上說(shuō)审轮,JDK=JRE+工具(編譯器肥哎、調(diào)試器、其他工具...)+ 類庫(kù)疾渣,我們進(jìn)行Java開發(fā)篡诽,至少應(yīng)當(dāng)有JDK。JDK的下載網(wǎng)站(鏈接為:https://www.oracle.com/java/technologies/javase-java-platform-install.html)榴捡。 對(duì)于Windows系統(tǒng)而言杈女,下載JDK之后,安裝起來(lái)與其他的軟件安裝時(shí)并沒(méi)有太大區(qū)別吊圾, 在此不多贅述达椰。
四)Java 開發(fā)環(huán)境配置
? 當(dāng)JDK安裝完成之后,還需要對(duì)電腦進(jìn)行一些環(huán)境變量配置项乒,完成之后才能進(jìn)行java程序開發(fā)啰劲。
? 以大家常用的widows系統(tǒng)為例:
? 右鍵點(diǎn)擊“我的電腦” -- 選擇“屬性” -- 選擇“高級(jí)系統(tǒng)設(shè)置” -- 選擇“環(huán)境變量”
? 在系統(tǒng)變量中,點(diǎn)擊“新建”檀何,增加JAVA_HOME系統(tǒng)變量蝇裤,這個(gè)變量的值設(shè)為JDK的安裝目錄。假設(shè)JDK安裝在D:\Java\jdk频鉴。 然后栓辜,在系統(tǒng)變量中,查找PATH變量(不區(qū)分大小寫)砚殿。在Path變量的末尾啃憎,增加一 句:“;D:\Java\jdk\bin”。注意兩個(gè)要點(diǎn):1似炎、在Path末尾增加辛萍,千萬(wàn)不要把原有的內(nèi)容去掉;2羡藐、增加的值為Java安裝目錄下的bin目錄贩毕。 最后,增加一個(gè) CLASSPATH變量仆嗦。值為“.”辉阶,注意不帶雙引號(hào)。
??當(dāng)所有的環(huán)境變量都配置好了之后,打開Windows中的命令行,執(zhí)行java -version谆甜。如果得到正確的版本信息垃僚,則說(shuō)明配置正常。
? 對(duì)于配置開發(fā)環(huán)境還有不了解的同學(xué)规辱,可以自行百度谆棺。網(wǎng)上的圖文教程很詳細(xì)。下一節(jié)我們開始第一個(gè)java程序Hello World罕袋。話說(shuō)程序員的道路都是從hello world開啟的改淑,請(qǐng)關(guān)注該篇博客的同學(xué)做好準(zhǔn)備。