Java 簡(jiǎn)介
1. Java 的歷史
1995 年 5 月 23 日,Sun Microsystems
公司宣布 Java 語(yǔ)言誕生, 當(dāng)時(shí)使用 Java 的總?cè)藬?shù)還不到 30 人,可能包括 Java 語(yǔ)言之父詹姆斯·高斯林
在內(nèi)的大多數(shù)聯(lián)合創(chuàng)始人都無(wú)法預(yù)想,Java 在未來(lái)的二十年間,居然會(huì)給互聯(lián)網(wǎng)乃至我們的生活帶來(lái)如此深遠(yuǎn)的影響。
目前 Java 提供以下三個(gè)版本:
-
Java Platform, Enterprise Edition(Java EE:Java 平臺(tái)企業(yè)版);
-
Java Platform, Standard Edition(Java SE:Java 平臺(tái)標(biāo)準(zhǔn)版);
-
Java Platform, Micro Edition(Java ME:Java 平臺(tái)微型版)。
2006 年,SUN 公司在 JavaOne 大會(huì)上,宣布在 GNU 通用公共協(xié)議(GPL)的構(gòu)架下向開源世界貢獻(xiàn) Java 平臺(tái),這次開放的 Java 版本包括了其標(biāo)準(zhǔn)版(Standard)、微型版(Micro)以及企業(yè)版(Enterprise)。這是一個(gè)具有 “歷史性意義” 的改變。

2. 語(yǔ)言特性
Java 語(yǔ)言的誕生,重新定義了面向?qū)ο缶幊蹋∣OP)
。Java 語(yǔ)言的創(chuàng)建之初,就定下了以下幾個(gè)目標(biāo):
-
簡(jiǎn)單易學(xué),并且面向?qū)ο螅?/p>
-
必須健壯且安全;
-
擺脫平臺(tái)的依賴性;
-
高性能執(zhí)行;
-
必須是可解釋的,多線程的,動(dòng)態(tài)的。
面向?qū)ο螅∣bject Oriented)指的是一種編程方法。面向?qū)ο蟮闹饕枷胧牵簢@著我們所操縱的 “事物”(即對(duì)象)來(lái)設(shè)計(jì)軟件。 計(jì)算機(jī)硬件的發(fā)展為軟件技術(shù)的發(fā)展提供了更好的土壤,為了讓大型軟件項(xiàng)目易于管理,降低開發(fā)和維護(hù)的成本,面向?qū)ο蠹夹g(shù)也就應(yīng)運(yùn)而生。為了了解面向?qū)ο蠹夹g(shù)的誕生原因,我們下面來(lái)介紹幾種比較具有代表性的軟件技術(shù)。
2.1.1 匯編語(yǔ)言
匯編語(yǔ)言是軟件技術(shù)的開端,這種語(yǔ)言與機(jī)器語(yǔ)言非常接近,并且可以很容易地轉(zhuǎn)換為可執(zhí)行代碼。使用匯編語(yǔ)言的程序員,必須了解計(jì)算機(jī)的詳細(xì)體系結(jié)構(gòu)才能編寫程序。
2.1.2 程序語(yǔ)言
在匯編語(yǔ)言之后,開發(fā)了高級(jí)語(yǔ)言,可以使用語(yǔ)言的編譯器(如 gcc
)將高級(jí)程序代碼轉(zhuǎn)換為機(jī)器指令。這樣程序員無(wú)需再深入了解計(jì)算機(jī)硬件的體系結(jié)構(gòu)。為了提高代碼的可復(fù)用性并最大程度地減少 GOTO 指令的使用,引入了面向過(guò)程
技術(shù)。雖然簡(jiǎn)化了軟件流程控制的創(chuàng)建和維護(hù),但是忽視了數(shù)據(jù)的組織。調(diào)試和維護(hù)許多全局變量的程序,變成了程序員的一場(chǎng)噩夢(mèng)。
2.1.3 面向?qū)ο笳Z(yǔ)言
在面向?qū)ο蟮恼Z(yǔ)言中,數(shù)據(jù)被抽象地封裝在對(duì)象中。特定于對(duì)象中的數(shù)據(jù)只能通過(guò)該對(duì)象來(lái)進(jìn)行訪問(wèn)。這樣,程序就成為了對(duì)象之間的一系列交互。Java 語(yǔ)言就是一個(gè)純面向?qū)ο蟮恼Z(yǔ)言。
2.2 跨平臺(tái)性
我們也許常常聽到一句口號(hào) ——“一次編譯,到處執(zhí)行(write once, run anywhere.)”,這里說(shuō)的就是 Java 的跨平臺(tái)性,我們首先來(lái)看下在 c
或 c++
中,代碼是如何在不同平臺(tái)運(yùn)行的:
在 c
或 c++
中,我們首先要將源代碼文件編譯為機(jī)器代碼文件,然后再去執(zhí)行它。這個(gè)過(guò)程中,機(jī)器代碼文件必須在為其編譯的平臺(tái)才能執(zhí)行(這里的平臺(tái)指的是 Windows、Linux、Mac OS 等),也就是說(shuō),我們的代碼如果希望在多個(gè)平臺(tái)執(zhí)行,那就必須多次編譯程序。這不僅給程序員帶來(lái)了繁瑣的開發(fā)步驟(代碼稍做變更就要重新編譯整個(gè)程序),也給程序帶來(lái)了更大的漏洞風(fēng)險(xiǎn)。當(dāng)代碼已經(jīng)編譯為可執(zhí)行文件時(shí),這個(gè)可執(zhí)行文件不能動(dòng)態(tài)更改,此時(shí)需要更改代碼重新編譯,以替換舊的可執(zhí)行文件。
我們來(lái)看看 Java
是如何做的吧:
Java 的思想是,將代碼編譯為中間語(yǔ)言
,中間語(yǔ)言是字節(jié)碼,解釋器是 Java 虛擬機(jī)(JVM
)。字節(jié)碼文件可以通用,JVM 是特定于平臺(tái)的。如下圖所示:

每一個(gè)平臺(tái)都需要一個(gè) JVM
,這里 JVM
是實(shí)現(xiàn) “到處執(zhí)行” 的關(guān)鍵前提,所以,在 Java 中,我們只需要生成一個(gè)字節(jié)碼文件,就可以保證我們編寫的程序在任何平臺(tái)都能運(yùn)行了。
2.3 標(biāo)準(zhǔn)化
在 Java
中,提供了大量的標(biāo)準(zhǔn)化庫(kù),這保證了我們使用統(tǒng)一的接口對(duì)程序進(jìn)行控制。
2.4 異常處理
異常處理的老方式是:讓每個(gè)函數(shù)返回一個(gè)錯(cuò)誤代碼,調(diào)用者會(huì)檢查其返回的內(nèi)容,這樣就導(dǎo)致了代碼中到處都是錯(cuò)誤碼的校驗(yàn),從而讓源碼變得難以閱讀。
在異常處理的新方式中,函數(shù)或方法不再返回錯(cuò)誤碼,而是以拋出異常的方式來(lái)進(jìn)行異常處理,在 Java 中可以使用 catch
關(guān)鍵字來(lái)捕獲在 try
語(yǔ)句塊中所發(fā)生的異常。這樣我們無(wú)需頻繁通過(guò)定義錯(cuò)誤代碼的方式處理異常,代碼可讀性大大提高。
2.5 動(dòng)態(tài)類加載
在 Java 中,如果在執(zhí)行階段不需要某個(gè)類,那么這個(gè)類就不會(huì)被編譯為字節(jié)碼。在網(wǎng)絡(luò)編程中,這個(gè)特性非常常用。當(dāng)我們不知道將執(zhí)行什么代碼時(shí),程序可以從文件系統(tǒng)或遠(yuǎn)端服務(wù)器加載類。
2.6 自動(dòng)垃圾回收機(jī)制
在常規(guī)語(yǔ)言(例如 C 和 C++)中,程序員必須確保已分配的內(nèi)存被釋放。防止造成內(nèi)存泄漏的麻煩。
內(nèi)存資源或緩沖區(qū)具有特定的操作模式以獲得最佳性能。一旦緩沖區(qū)中充滿了數(shù)據(jù),就需要在不再使用其內(nèi)容之后將其清除。如果程序員忘記清除其代碼中的內(nèi)容,則內(nèi)存很容易過(guò)載。Java 使用自動(dòng)垃圾收集器來(lái)管理對(duì)象生命周期中的內(nèi)存。程序員確定何時(shí)創(chuàng)建對(duì)象,一旦不再使用對(duì)象,Java 運(yùn)行時(shí)將負(fù)責(zé)恢復(fù)內(nèi)存。一旦沒有了對(duì)對(duì)象的引用,則垃圾回收器將自動(dòng)釋放無(wú)法訪問(wèn)的內(nèi)存。
自動(dòng)垃圾回收機(jī)制,讓使用 Java 編寫的代碼更加健壯,降低了內(nèi)存泄漏和溢出的風(fēng)險(xiǎn)。程序員唯一需要注意的是對(duì)象創(chuàng)建的速度。如果應(yīng)用程序創(chuàng)建對(duì)象的速度超過(guò)了垃圾收集器釋放對(duì)象的速度,則可能導(dǎo)致內(nèi)存相關(guān)問(wèn)題。
3. Java 的版本歷史
Java 的主要發(fā)行版本及其發(fā)行日期如下:
-
JDK 1.0(1996 年 1 月 23 日)
-
JDK 1.1(1996 年 2 月 19 日)
-
J2SE 1.2(1998 年 12 月 8 日)
-
J2SE 1.3(2000 年 5 月 8 日)
-
J2SE 1.4(2002 年 2 月 6 日)
-
J2SE 5.0(2004 年 9 月 30 日)
-
Java SE 6(2006 年 12 月 11 日)
-
Java SE 7(2011 年 7 月 28 日)
-
Java SE 8(2014 年 3 月 18 日)
-
Java SE 9(2017 年 9 月 21 日)
-
Java SE 10(2018 年 3 月 20 日)
-
Java SE 11(2018 年 9 月 25 日)
-
Java SE 12(2019 年 3 月 19 日)
-
Java SE 13(2019 年 9 月 17 日)
-
Java SE 14(2020 年 3 月 17 日)
-
Java SE 15(2020 年 9 月 15 日)
-
Java SE 16(2021 年 3 月 16 日)
4. 名詞解釋
我們將在后續(xù)詳細(xì)介紹如何在不同平臺(tái)上安裝 Java,在安裝 Java 之前,我們需要理解兩個(gè)名詞,JDK 和 JRE:
-
JRE:Java Runtime Environment (Java 運(yùn)行時(shí)環(huán)境)
-
JDK:Java Development Kit (Java 開發(fā)工具包)
以上兩個(gè)名詞是 Java 平臺(tái)的兩大重要軟件,他們分別可以幫助用戶運(yùn)行和開發(fā) Java 程序,JDK 是 JRE 的超集,包含 JRE 的所有內(nèi)容,以及開發(fā)小程序和應(yīng)用程序所需的工具,例如編譯器和調(diào)試器。
簡(jiǎn)單來(lái)說(shuō),我們?nèi)绻胍?Java 語(yǔ)言去開發(fā)應(yīng)用程序,就要在我們的電腦上安裝 JDK。本教程使用最新版本的 Java 16
。
5. 學(xué)習(xí)基礎(chǔ)
學(xué)習(xí)本教程,最好有一定的計(jì)算機(jī)基礎(chǔ)知識(shí),熟悉計(jì)算機(jī)軟件的下載、安裝等。當(dāng)然,如果你沒有任何基礎(chǔ)知識(shí)也不必?fù)?dān)心,本教程會(huì)盡量使用通俗易懂的語(yǔ)言來(lái)講解知識(shí)點(diǎn)。
6. 小結(jié)
在大多數(shù)人看來(lái),Java 語(yǔ)言已經(jīng)非常完美,但是,Java 語(yǔ)言并非沒有缺陷,Java 語(yǔ)言缺少硬件特定的數(shù)據(jù)類型,也沒有能夠指向任意地址的指針或編程方法之類的功能。盡管這些功能有可能被程序員誤用或?yàn)E用,但不得不承認(rèn)它們是強(qiáng)大的工具。
在本節(jié)中,我們對(duì) Java 語(yǔ)言的歷史以及主要特性有了一個(gè)初步的了解,小伙伴們是不是已經(jīng)迫不及待,要更加深入了解 Java 了呢?那么在下一小節(jié),我們將了解如何在自己的電腦上安裝 Java。