為什么要學(xué)習(xí) Java
Java這門語(yǔ)言如今是互聯(lián)網(wǎng)行業(yè)炙手可熱的編程語(yǔ)言,像 阿里、美團(tuán)這些大廠,技術(shù)體系都是建立在 Java 之上。這些大廠又是很多新興互聯(lián)網(wǎng)企業(yè)的技術(shù)風(fēng)向標(biāo),因此 Java 使用范圍相當(dāng)?shù)膹V,對(duì) Java 程序員的需求量就相當(dāng)?shù)拇蟆?/p>
Java 不僅僅是一杯熱騰騰的咖啡,還可以是一個(gè)靠得住的飯碗!
蝸牛從大學(xué)開始就接觸 Java,工作之后也一直是使用 Java 這門程序設(shè)計(jì)語(yǔ)言作為編程艏選。希望結(jié)合自己的知識(shí)體系和實(shí)踐經(jīng)驗(yàn),產(chǎn)出 Java 學(xué)習(xí)的一系列教程,能夠幫助到對(duì) Java 感興趣或者有志于從事 Java 程序員這個(gè)崗位的同學(xué)。
學(xué)習(xí)一個(gè)東西,首先要知道它是什么,基于什么樣的背景下出現(xiàn)的,后續(xù)又是如何演變的。本文就簡(jiǎn)要介紹下 Java 的歷史。
計(jì)算機(jī)系統(tǒng)層次與編程語(yǔ)言進(jìn)化史
那么 Java 是怎么出現(xiàn)的呢?都有其他編程語(yǔ)言了,為什么還需要它?
編程語(yǔ)言既然是運(yùn)行在計(jì)算機(jī)之上的,我們首先看下計(jì)算機(jī)系統(tǒng)層次與編程語(yǔ)言的進(jìn)化史。
早期計(jì)算機(jī)系統(tǒng)是用 機(jī)器語(yǔ)言進(jìn)行編程,機(jī)器語(yǔ)言也就被稱為 第1代程序設(shè)計(jì)語(yǔ)言(First Generation Programing Language, 1GL)。
機(jī)器語(yǔ)言簡(jiǎn)單講就是由二進(jìn)制數(shù) 0 和 1 組成的一串指令。眾多指令構(gòu)成的指令集,就可以操控計(jì)算機(jī)硬件。
但如果讓你只用 0 和 1 來設(shè)計(jì)程序,你肯定頭大,因?yàn)闄C(jī)器語(yǔ)言的 可讀性,容錯(cuò)性和便捷性真的是太差了!
因此后期的計(jì)算機(jī)系統(tǒng)用一些容易理解和記憶的字母或單詞來代替一個(gè)特定的指令,比如:用「ADD」代表數(shù)字邏輯上的加減,這就是 第二代程序設(shè)計(jì)語(yǔ)言——匯編語(yǔ)言。
匯編語(yǔ)言需要轉(zhuǎn)換成機(jī)器指令, 操作系統(tǒng)就提供了匯編語(yǔ)言與機(jī)器交互的界面。操作系統(tǒng)將指令集體系結(jié)構(gòu)進(jìn)行封裝,抽象成被上層用戶使用的接口,包括用戶界面和底層服務(wù)。
如果學(xué)習(xí)過匯編語(yǔ)言的同學(xué)會(huì)知道,匯編語(yǔ)言是一種低級(jí)語(yǔ)言,仍然要和計(jì)算機(jī)硬件直接打交道,比如它還是要調(diào)用存儲(chǔ)器存儲(chǔ)數(shù)據(jù)。
這就意味著匯編語(yǔ)言不僅 編寫復(fù)雜易出錯(cuò),它的 可移植性也很差!我換一個(gè)有點(diǎn)差異的計(jì)算機(jī)硬件,這個(gè)應(yīng)用程序就會(huì)掛。
為了解決這個(gè)問題,現(xiàn)代的計(jì)算機(jī)系統(tǒng)就支持了高級(jí)語(yǔ)言。首先出現(xiàn)的是 第三代程序設(shè)計(jì)語(yǔ)言——過程式高級(jí)語(yǔ)言,編碼時(shí)需要描述實(shí)現(xiàn)過程,即「如何做」,像 C 語(yǔ)言這種。
隨著過程式高級(jí)語(yǔ)言的廣泛使用,越來越多的人發(fā)現(xiàn),他們其實(shí)不關(guān)心問題的解法和執(zhí)行過程,他們只關(guān)心自己的輸入記錄以及蕞終的輸出結(jié)果,其它工作希望都由系統(tǒng)來完成。
基于這樣的思路,后來就出現(xiàn)了 第四代程序設(shè)計(jì)語(yǔ)言——非過程式高級(jí)語(yǔ)言,編碼時(shí)只需說明「做什么」,不需要描述具體的算法實(shí)現(xiàn)細(xì)節(jié),像 Java 語(yǔ)言這種。
Java 萌芽期
Java 起初不叫 Java,它的出現(xiàn)也不是必然。
在 1990 年年末,美國(guó)一家叫 Sun 的公司著手研發(fā)嵌入式系統(tǒng)用于家電領(lǐng)域。當(dāng)時(shí)安排 James Gosling 領(lǐng)導(dǎo)研發(fā),內(nèi)部把這個(gè)項(xiàng)目命名為 「 Green 計(jì)劃」,這個(gè)計(jì)劃的目標(biāo)是為下一代智能家電(電視機(jī)、微波爐、電話)編寫通用的控制系統(tǒng)。
當(dāng)時(shí)比較常用的編程語(yǔ)言是 C++,但 C++ 其實(shí)不太好用。第1,C++ 復(fù)雜,容易造成開發(fā)者誤用,第二,C++ 缺少垃圾回收系統(tǒng)、可移植性、分布式和多線程等功能。
于是,Sun 首席科學(xué)家 Bill Joy 就提議開發(fā)新語(yǔ)言,在 C++ 的基礎(chǔ)上,開發(fā)一種面向?qū)ο蟮沫h(huán)境。
James Gosling 就投入研發(fā)全新的語(yǔ)言,新的語(yǔ)言需要名字來展示生命力,這時(shí) James Gosling 看到了辦公室外的橡樹,就把新語(yǔ)言命名為: Oak。
1992 年夏天,Green 計(jì)劃完成 Oak 程序設(shè)計(jì)語(yǔ)言、類庫(kù)以及 Green 操作系統(tǒng)的研發(fā)。
1992 年 11 月,Green 計(jì)劃轉(zhuǎn)化成 Sun 的全資子公司——FirstPerson 有限公司,準(zhǔn)備大干一場(chǎng)。
但當(dāng)他們拿這個(gè)產(chǎn)品對(duì)外進(jìn)行商業(yè)合作時(shí),卻屢屢碰壁。有線電視業(yè)界覺得 FirstPerson 平臺(tái)給了用戶過多的控制權(quán),拒絕同 FirstPerson 合作。
FirstPerson 意識(shí)到自己在電視工業(yè)領(lǐng)域沒有前景,于是把公司并回到 Sun。
隨著互聯(lián)網(wǎng)和瀏覽器的出現(xiàn),James Gosling 團(tuán)隊(duì)敏銳的意識(shí)到,互聯(lián)網(wǎng)在向高度遠(yuǎn)程互動(dòng)的方向上演變。
這個(gè)方向正是他們?cè)谧鲇芯€電視網(wǎng)中看到的,因此他們決定改變努力的目標(biāo),將 Green 計(jì)劃中的技術(shù)應(yīng)用到萬維網(wǎng)上。
1994 年秋,團(tuán)隊(duì)完成第1個(gè) Oak 語(yǔ)言的網(wǎng)頁(yè)瀏覽器:WebRunner,并獲得高層的一致好評(píng)。
Java 取名那些事兒
由于 Oak 商標(biāo)被一家顯卡制造商注冊(cè),于是將 Oak 更名為 Java。Java 得名于 印度尼西亞爪哇島,這個(gè)地方因盛產(chǎn) 咖啡而聞名。
Java 語(yǔ)言體系里也有很多和咖啡相關(guān)的東西。
比如 Java 源代碼編譯出的二進(jìn)制文件 (.class 文件),如果你用十六進(jìn)制編輯器打開,會(huì)發(fā)現(xiàn)蕞前面的 32 位顯示為 CA FE BA BE,也就是詞組 CAFE BABE(咖啡屋寶貝)。
以下是我將 Demo.java 文件編譯成 Demo.class 文件后,用網(wǎng)站工具看到的內(nèi)容,感興趣的同學(xué)可以親自試下。
publicclassDemo
再比如,Java 語(yǔ)言中的許多庫(kù)類名稱和咖啡有關(guān),像 JavaBeans(咖啡豆)、NetBeans(網(wǎng)絡(luò)豆)以及 ObjectBeans(對(duì)象豆)等等。SUN 和 JAVA 的標(biāo)識(shí)也是一杯正冒著熱氣的咖啡。
Java 初創(chuàng)期
1995 年初,Sun 對(duì)外發(fā)布 Java 語(yǔ)言,并提供免費(fèi)下載,放在互聯(lián)網(wǎng)上向所有人公開。本次的 Java 發(fā)布版本為 JDK BETA。
JDK 全稱 Java Development ToolKit,指 Java 語(yǔ)言開發(fā)工具包。
同時(shí)對(duì)外發(fā)布可在網(wǎng)頁(yè)中運(yùn)行 Java 程序(也叫 Java Applet)的網(wǎng)頁(yè)瀏覽器——WebRunner,并將其更名為 HotJava。
與此同時(shí),如日中天的網(wǎng)景也決定讓旗下的瀏覽器對(duì) Java 進(jìn)行支持。
隨后的幾個(gè)月,Java 引爆互聯(lián)網(wǎng),數(shù)萬人訪問 Sun 官網(wǎng),下載 Java 語(yǔ)言?;ヂ?lián)網(wǎng)上立即出現(xiàn)數(shù)不清的 Java Applet,演示著小動(dòng)畫、小游戲等。
為了方便開發(fā)者能夠快速開發(fā)出復(fù)雜的應(yīng)用程序,Sun 獨(dú)立出一條 Java 業(yè)務(wù)線,專門開發(fā) Java 技術(shù)。
1996 年 1 月, Sun 發(fā)布 JDK 1.0。這個(gè)版本集成了 Java 運(yùn)行環(huán)境和開發(fā)工具。
1997 年 2 月, Sun 發(fā)布 JDK 1.1。這個(gè)版本增加 JDBC、反射等能力。
Java 的出現(xiàn),讓互聯(lián)網(wǎng)的網(wǎng)頁(yè)動(dòng)了起來。但隨著 Adobe 公司 Flash 的流行,這款無須任何編程語(yǔ)言知識(shí),就能做出各種動(dòng)畫的軟件,逐步侵蝕了 Java 在瀏覽器端的地位。
有了 Flash 還用 Java 干嘛?Java 存在的意義是什么?Java 定位的問題一直深深困擾著 Sun。
直到 1998 年 12 月,Sun 發(fā)布 第二代 Java 企業(yè)平臺(tái),Java 版本為 JDK 1.2,這是 Java 第1個(gè)里程碑式的版本。
該版本引入集合框架,Java 基礎(chǔ)類庫(kù)等能力,同時(shí)發(fā)布了 JSP/Servlet、EJB 等企業(yè)平臺(tái)規(guī)范。
1999 年 6 月,Sun 發(fā)布 Java 的三個(gè)版本:J2SE、J2EE 和 J2ME。
J2SE(Java 2 Platform, Standard Edition):Java 的標(biāo)準(zhǔn)版,用于普通 PC 應(yīng)用的開發(fā),是 Java 技術(shù)的核心與基礎(chǔ),也是 J2ME 和 J2EE 編程基礎(chǔ)。
J2EE(Java 2 Platform, Enterprise Edition):Java 的企業(yè)版,用于企業(yè)級(jí)應(yīng)用開發(fā)。
J2ME(Java 2 Platform, Micro Edition):Java 的微型版,用于嵌入式設(shè)備及消費(fèi)類電器的開發(fā)。
可以看到,Sun 已經(jīng)很明確 Java 的定位了,就是向 PC 、企業(yè)和移動(dòng)三個(gè)方向發(fā)展。
JDK 1.2 影響深遠(yuǎn),Java 發(fā)生了很多革命性的變化,并且它的很多能力和規(guī)范沿用至今。至此,Sun 時(shí)代 Java 的初創(chuàng)期結(jié)束,進(jìn)入了飛速發(fā)展的階段。
Java 發(fā)展期
2000 年 5 月, J2SE 1.3 發(fā)布。該版本將 Hotspot作為 Java 的默認(rèn)虛擬機(jī)實(shí)現(xiàn)。
同期 Servlet 規(guī)范開始流行,伴隨著互聯(lián)網(wǎng)的興起,同其他 MVC 框架,成為 Web1.0 的網(wǎng)紅。
2002 年 2 月, J2SE 1.4 發(fā)布。該版本的 Java 已經(jīng)相對(duì)成熟,它提供了完備的語(yǔ)言特性,像 NIO、正則表達(dá)式和 XML 處理器等。
與此同時(shí),基于 Java 語(yǔ)言的開源框架:Struts、Hibernate、Spring 以及大量企業(yè)應(yīng)用服務(wù)器比如 WebLogic、JBoss 等相繼涌現(xiàn),這讓 Java 語(yǔ)言繼續(xù)飛速發(fā)展。
2004 年 9 月, J2SE 1.5 發(fā)布。這是 Java 第二個(gè)里程碑式的版本,為了表示這個(gè)版本的重要性, J2SE 1.5 更名為 J2SE 5.0。
該版本增加泛型、for-each 循環(huán)、自動(dòng)裝箱和拆箱、枚舉、可變參數(shù)、靜態(tài)導(dǎo)入、注解、并發(fā)包等。
2005 年,Sun 將 Java 的三個(gè)版本更名為 Java SE、Java EE 和 Java ME。J2SE 5.0 也被更名為 Java SE 5。
2006 年 12 月, Java SE 6 發(fā)布。該版本在語(yǔ)言語(yǔ)法改進(jìn)不多,但在虛擬機(jī)內(nèi)部做了大量改進(jìn),成為相對(duì)成熟穩(wěn)定的一個(gè)版本。于是,很多企業(yè)都以這個(gè)版本作為 Java 開發(fā)版本來使用。
同年 Sun 做了一個(gè)偉大的決定,將 Java 開源。通過 OpenJDK 計(jì)劃,將 Java 虛擬機(jī)、Java 編譯器和 Java 類庫(kù)以 GPL 公開。
至此,Java 的生態(tài)初具規(guī)模,Java 的授權(quán)使用方式也很明確,Sun 時(shí)代 Java 的發(fā)展期結(jié)束,正走向它的成熟穩(wěn)定。
Java 穩(wěn)定期
2009 年, Oracle 收購(gòu) Sun,Java 由 Oracle 繼續(xù)維護(hù)。Java 的 Sun 時(shí)代終結(jié),正式進(jìn)入 Oracle 時(shí)代。
2011 年 7 月,Oracle 發(fā)布 Java SE 7,主要特性是 NIO2 和 Fork/Join 并發(fā)包。
2014 年 3 月,Oracle 發(fā)布 Java SE 8(LTS),這是 Java 第三個(gè)里程碑版本,也是長(zhǎng)期(一般 3~5 年)支持的一個(gè)版本。
該版本不僅引入 Lambda 表達(dá)式支持了函數(shù)式編程能力,而且還增加了很多新的語(yǔ)言特性,比如 Streams,Date/Time API,集合的并行計(jì)算等。
Java SE 8 像 Java SE 6 一樣,被很多企業(yè)作為開發(fā)版本來使用。尤其是新的 Java 應(yīng)用,當(dāng)然也有企業(yè)會(huì)選擇把 Java 6 應(yīng)用升級(jí)到 Java 8 應(yīng)用。
2017 年 9 月,Oracle 發(fā)布 Java SE 9,該版本蕞大特征就是模塊化。
2018 年 3 月,Oracle 發(fā)布 Java SE 10,該版本新增局部類型推斷 var 等特性。
2018 年 9 月,Oracle 發(fā)布 Java SE 11(LTS),這是在 Java SE 8 之后又一個(gè)長(zhǎng)期支持的版本,該版本開始支持 ZGC。
由于 Java SE 8 逐漸停止維護(hù)更新,再加上 Java SE 11 各種優(yōu)秀的特性,而且是長(zhǎng)期支持版本,預(yù)測(cè)未來很多企業(yè)將會(huì)使用 Java SE 11 作為開發(fā)版本來使用。
從這一年開始,Oracle 也宣布,此后 Java 保持每半年一個(gè)大版本的更新。