摘要:本文主要對Java這門編程語言進行簡單的介紹。 Java簡介 說明 Java語言歷時十多年,已發展成為人類電腦史上影響深遠的編程語言,從某種程度上來看,它甚至超出了編程語言的範疇,成為一種開發平臺,一種開發規範。Java語言所崇尚的開源、自由等精神,吸引了全世界無數優秀的程式員。事實是,從人 ...
摘要:本文主要對Java這門編程語言進行簡單的介紹。
Java簡介
說明
Java語言歷時十多年,已發展成為人類電腦史上影響深遠的編程語言,從某種程度上來看,它甚至超出了編程語言的範疇,成為一種開發平臺,一種開發規範。Java語言所崇尚的開源、自由等精神,吸引了全世界無數優秀的程式員。事實是,從人類有史以來,從來沒有一門編程語言能吸引這麼多的程式員,也沒有一門編程語言能衍生出如此之多的開源框架。
Java語言是一門非常純粹的面向對象編程語言,它吸收了C++語言的各種優點,又摒棄了C++里難以理解的指針等概念。Java語言作為靜態面向對象編程語言的代表,很好地實現了面向對象理論,允許程式員以優雅的思維方式進行複雜的編程開發。
不僅如此,Java語言相關的Java EE規範里包含了時下最流行的各種軟體工程理念,各種先進的設計思想總能在Java EE平臺以及相關框架里找到相應實現。從某種程度上來看,學精了Java語言的相關方面,相當於系統地學習了軟體開發相關知識,而不是僅僅學完了一門編程語言。
時至今日,大部分銀行、電信、證券、電子商務、電予政務等系統已經採用Java EE平臺構建,或者正在逐漸過渡到採用Java EE平臺來構建,Java EE規範是目前最成熟的也是應用最廣的企業級應用開發規範。
Java的誕生
Java語言的誕生具有一定的戲劇性,它並不是經過精心策劃、製作,最後產生的劃時代產品,從某個角度來看,Java語言的誕生完全是一種誤會。
1990年年末,Sun公司預料嵌入式系統將在未來家用電器領域大顯身手。於是Sun公司成立了一個由James Gosjing領導的Green計劃,準備為下一代智能家電(如電視機、微波爐、電話)編寫一個通用控制系統。
該團隊最初考慮使用C++語言,但是很多成員包括Sun的首席科學家Bill Joy,發現C++和可用的API在某些方面存在很大問題。而且工作小組使用的是嵌入式平臺,可用的系統資源極其有限。並且很多成員都發現C++太複雜,以致很多開發者經常錯誤使用。而且C++缺少垃圾回收系統、可移植性、分散式和多線程等功能。
根據可用的資金,Bill Joy決定開發一種新語言,他提議在C++的基礎上,開發一種面向對象的環境。於是James Gosling試圖通過修改和擴展C++的功能來滿足這個要求,但是後來他放棄了,他決定創造一種全新的語言:Oak。
到了1992年的夏天,Green計劃已經完成了新平臺的部分功能,包括Green操作系統、Oak的程式設計語言、類庫等。同年11月,Green計劃被轉化成了一個Sun公司的全資子公司。
新公司致力於創建一種高度互動的設備。當時代華納公司發佈了一個關於電視機頂盒的征求提議書時,他們改變了目標,作為對征求提議書的響應,提出了一個機頂盒平臺的提議,但在當時市場不成熟的情況下,他們的項目沒有獲得成功。
此時,可憐的Green項目幾乎接近夭折,甚至Green項目組的一半成員也被調到了其他項目組。
正如中國古代的寓言所言:塞翁失馬,焉知非福?如果Green項目在機頂盒平臺投標成功,也許就不會誕生Java這門偉大的語言了。
1994年夏天,互聯網和瀏覽器的出現不僅給廣大互聯網的用戶帶來了福音,也給Oak語言帶來了新的生機。Gosling立即意識到,這是一個機會,於是對Oak進行了小規模的改造,到了1994年秋,小組完成了第一個Java語言的網頁瀏覽器。Sun公司實驗室主任和技術總監觀看了該瀏覽器的演示,對該瀏覽器的效果給予了高度評價。當時Oak這個商標已被別人註冊,於是只得將Oak更名為Java。
Java的發展
Sun公司在1995年年初發佈了Java語言,Sun公司直接把Java放到互聯網上,免費給大家使用。甚至連源代碼也不保密,也放在互聯網上向所有人公開。
幾個月後,讓所有人都大吃一驚的事發生了:Java成了互聯網上最熱門的寶貝。竟然有10萬多人次訪問了Sun公司的網頁,下載了Java語言。然後,互聯網上立即就有數不清的Java小程式(也就是Applet),演示著各種小動畫、小游戲等。Java語言終於揚眉吐氣了,成為了一種廣為人知的編程語言。
在Java語言出現之前,互聯網的網頁實質上就像是一張紙,不會有任何動態的內容。有了Java語言之後,瀏覽器的功能被擴大了。Java程式可以直接在瀏覽器里運行,可以直接與遠程伺服器交互。用Java語言編程,可以在互聯網上像傳送電子郵件一樣方便地傳送程式文件。
歷史版本
JDK 1.0
Sun公司在1995年年初發佈了Java語言,同時放到了互聯網上,免費給大家使用,甚至連源代碼也不保密,對所有人公開,這就是所謂的開源。之後吸引了大批的程式員使用Java語言開發出了各種小動畫、小游戲等。
Sun公司雖然推出了Java,但這隻是一種語言,如果想要開發複雜的應用程式,必須要有一個強大的開發類庫。
因此,Sun在1996年年初發佈了JDK 1.0。這個版本包括兩部分:運行環境(JRE)和開發環境(JDK)。
◆ 運行環境(Java Runtime Environment):包括核心API、集成API、用戶界面API、發佈技術、Java虛擬機(JVM)。
◆ 開發環境(Java Development Kit):包括編譯Java程式的編譯器(即javac命令)。
在JDK 1.0時代,JDK除了AWT(一種用於開發圖形用戶界面的API)外,其它的庫並不完整。
JDK 1.1
接著,Sun在1997年2月18日發佈了JDK 1.1。JDK 1.1增加了JIT(即時編譯)編譯器。JIT和傳統的編譯器不同:傳統的編譯器是編譯一條,運行完後將其扔掉;而JIT會將經常用到的指令保存在記憶體中,當下次調用時就不需要重新編譯了。通過這種方式讓JDK在效率上有了較大提升。
但一直以來,Java主要的應用就是網頁上的Applet以及一些移動設備。到了1996年年底,Flash面世了,這是一種更加簡單的動畫設計軟體:使用Flash幾乎無須任何編程語言知識,就可以做出豐富多彩的動畫。隨後Flash增加了ActionScript編程腳本,Flash逐漸蠶食了Java在網頁上的應用。
從1995年Java的誕生到1998年年底,Java語言雖然成為了互聯網上廣泛使用的編程語言,但它並沒有找到一個準確的定位,也沒有找到它必須存在的理由。Java語言可以編寫Applet,而Flash一樣可以做到,而且更快,開發成本更低。
JDK 1.2
直到1998年12月,Sun發佈了Java歷史上最重要的JDK版本:JDK 1.2。伴隨JDK 1.2一同發佈的還有jsp/servlet、EJB(Enterprise Java Bean)等規範,並將Java分成了J2EE、J2SE和J2ME三個版本。
◆ J2EE 企業版(Java 2 Platform,Enterprise Edition):Java技術中應用最廣泛的部分,J2EE提供了企業應用開發相關的完整解決方案。
◆ J2SE 標準版(Java 2 Platform,Simple Edition):整個Java技術的核心和基礎,它是J2ME和J2EE編程的基礎。
◆ J2ME 微縮版(Java 2 Platform,Micro Edition):主要用於控制移動設備和信息家電等有限存儲的設備。
這標志著Java已經吹響了向企業、桌面和移動3個領域進軍的號角,標志著Java已經進入Java 2時代,這個時期也是Java飛速發展的時期。
在Java 2中,Java發生了很多革命性的變化,而這些革命性的變化一直沿用到現在,對Java的發展形成了深遠的影響。直到今天,我們還經常看到J2EE、J2ME等名稱。
不僅如此,JDK 1.2還把它的API分成了三大類:
◆ 核心API:由Sun公司制定的基本的API,所有的Java平臺都應該提供。這就是我們平常所說的Java核心類庫。
◆ 可選API:這是Sun為JDK提供的擴充API,這些API因平臺的不同而不同。
◆ 特殊API:用於滿足特殊要求的API。如用於JCA相JCE的第三方加密類庫。
JDK 1.4
2002年2月,Sun發佈了JDK歷史上最為成熟的版本:JDK 1.4。此時由於Compaq、Fujitsu、SAS、Symbian、IBM等公司的參與,使JDK 1.4成為發展最快的一個JDK版本。到JDK 1.4為止,我們已經可以使用Java實現大多數的應用了。
在此期間,Java語言在企業應用領域大放異彩,涌現出大量基於Java語言的開源框架:Struts、WebWork、Hibemate、Spring等;大量企業應用伺服器也開始涌現:WebLogic、WebSphere、JBoss等,這些都標志著Java語言進入了飛速發展時期。
JDK 1.5
2004年10月,Sun發佈了萬眾期待的JDK 1.5,同時,Sun將JDK 1.5改名為Java SE 5.0。J2EE、J2ME也相應地改名Java EE和Java ME。JDK 1.5增加了諸如泛型、增強的for語句、可變數量的形參、註釋(Annotations)、自動拆箱和裝箱等功能。同時,也發佈了新的企業級平臺規範如通過註釋等新特性來簡化EJB的複雜性,並推出了EJB 3.0規範。還推出了自己的MVC框架規範:JSF,JSF規範類似於ASP.NET的伺服器端控制項,通過它可以快速地構建複雜的JSP界面。
JDK 1.6
2006年12月,Sun公司發佈了JDK 1.6(也被稱為Java SE 6)。一直以來,Sun公司維持了大約2年發佈一次JDK新版本的習慣。
但在2009年4月20日,Oracle宣佈將以每股9.5美元的價格收購Sun,該交易的總價值約為74億美元。而Oracle通過收購Sun公司獲得了兩項軟體資產:Java和Solaris。
於是曾經代表一個時代的公司:Sun終於被“雨打風吹”去,“江湖”上再也沒有了Sun的身影。多年以來,在新一輩的程式員心中可能會遺忘曾經的Sun公司,但老一輩的程式員們將永久地懷念Sun公司的傳奇。
Sun倒下了,不過Java的大旗依然“獵獵”作響。2007年11月,Google宣佈突出一款基於Linux平臺的的開源手機操作系統:Android。Android的出現順應了即將出現的移動互聯網潮流,而且Android系統的用戶體驗非常好,因此迅速成為手機操作系統的中堅力量。Android平臺使用了Dalvik虛擬機來運行.dex文件,Dalvik虛擬機的作用類似於JVM虛擬機,只是他並未遵守JVM規範而已。Android使用Java語言來開發應用程式,這也給了Java語言一個新的機會。在過去的歲月中,Java語言作為伺服器端編程語言,已經取得了極大的成功;而Android平臺的流行,則讓Java語言獲得了在客戶端程式上大展拳腳的機會。
JDK 1.7
2011年7月28日,Oracle公司終於“如約”發不了Java SE 7,這次版本的升級經過了將近5年時間。Java SE 7 也是Oracle發佈的第一個Java版本。Java SE 7雖然並未完全滿足所有人的期望,不過它也加入了不少新特性。
基本概念
特點
◆ 完全面向對象,動態。
◆ 解釋性,簡單易移植,跨平臺。
◆ 安全健壯,高性能。
◆ 多線程,分散式。
運行機制
電腦高級語言接程式的執行方式可以分為編譯型和解釋型兩種。
Java語言是一種特殊的高級語言,它既具有解釋型語言的特征,也具有編譯型語言的特征,因為Java程式要經過先編譯,後解釋兩個步驟。
編譯型語言
編譯型語言是指使用專門的編譯器,針對特定平臺(操作系統)將某種高級語言源代碼一次性“翻譯”成可被該平臺硬體執行的機器碼(包括機器指令和操作數),並包裝成該平臺所能識別的可執行性程式的格式,這個轉換過程稱為編譯(Compile)。編譯生成的可執行性程式可以脫離開發環境,在特定的平臺上獨立運行。有些程式編譯結束後,還可能需要對其他編譯好的目標代碼進行鏈接,即組裝兩個以上的目標代碼模塊生成最終的可執行性程式,通過這種方式實現低層次的代碼復用。因為編譯型語言是一次性地編譯成機器碼,所以可以脫離開發環境獨立運行,而且通常運行效率較高。但因為編譯型語言的程式被編譯成特定平臺上的機器碼,因此編譯生成的可執行性程式通常無法移植到其他平臺上運行;如果需要移植,則必須將源代碼複製到特定平臺上,針對特定平臺進行修改,至少也需要採用特定平臺上的編譯器重新編譯。
現有的C、C++、Fortran、Pascal等高級語言都屬於編譯型語言。
解釋型語言
解釋型語言是指使用專門的解釋器對源程式逐行解釋成特定平臺的機器碼並立即執行的語言。解釋型語言通常不會進行整體性的編譯和鏈接處理,解釋型語言相當於把編譯型語言中的編譯和解釋過程混合到一起同時完成。可以認為:每次執行解釋型語言的程式都需要進行一次編譯,因此解釋型語言的程式運行效率通常較低,而且不能脫離解釋器獨立運行。但解釋型語言有一個優勢:跨平臺比較容易,只需提供特定平合的解釋器即可,每個特定平臺上的解釋器負責將源程式解釋成特定平臺的機器指令即可。解釋型語言可以方便地實現源程式級的移植,但這是以犧牲程式執行效率為代價的。
現有的Ruby、Python等語言都屬於解釋型語言。
偽編譯型語言
除此之外,還有一種偽編譯型語言,如Visual Basic,它屬於半編譯型語言,並不是真正的編譯型語言。它首先被編譯成P-代碼,並將解釋引擎封裝在可執行性程式內,當運行程式時P-代碼會被解析成真正的二進位代碼。錶面上看起來,Visual Basic可以編譯生成可執行性的EXE文件,而且這個EXE文件也可以脫離開發環境,在特定平臺上運行,非常像編譯型語言。實際上,在這個EXE文件中,既有程式的啟動代碼,也有鏈接解釋程式的代碼,而這部分代碼負責啟動Visual Basic解釋程式,再對Visual Basic代碼進行解釋並執行。
Java程式的運行機制和JVM
Java程式的運行機制
Java語言比較特殊,由Java語言編寫的程式需要經過編譯步驟,但這個編譯步驟並不會生成特定平臺的機器碼,而是生成一種與平臺無關的位元組碼(也就是.class文件)。當然,這種位元組碼不是可執行性的,必須使用Java解釋器來解釋執行。因此,我們可以認為:Java語言既是編譯型語言,也是解釋型語言。或者說,Java語言既不是純粹的編譯型語言,也不是純粹的解釋型語言。
Java程式的執行過程必須經過先編譯,後解釋兩個步驟,如圖所示:
JVM
Java語言里負責解釋執行位元組碼文件的是Java虛擬機,即JVM(Java Virtual Machine)。JVM是可運行Java位元組碼文件的虛擬電腦。所有平臺上的JVM向編譯器提供相同的編程介面,而編譯器只需要面向虛擬機,生成虛擬機能理解的代碼,然後由虛擬機來解釋執行。在一些虛擬機的實現中,還會將虛擬機代碼轉換成特定系統的機器碼執行,從而提高執行效率。
當使用Java編譯器編譯Java程式時,生成的是與平臺無關的位元組碼,這些位元組碼不面向任何具體平臺,只面向JVM。不同平臺上的JVM都是不同的,但它們都提供了相同的介面。JVM是Java程式跨平臺的關鍵部分,只要為不同平臺實現了相應的虛擬機,編譯後的Java位元組碼就可以在該平臺上運行。顯然,相同的位元組碼程式需要在不同的平臺上運行,這幾乎是“不可能的”,只有通過中間的轉換器才可以實現,JVM就是這個轉換器。
JVM是一個抽象的電腦,和實際的電腦一樣,它具有指令集並使用不同的存儲區域。它負責執行指令,還要管理數據、記憶體和寄存器。
理解JVM
JVM的作用很容易理解,就像同一個插座,需要給兩個不同介面的手機充電,這就需要為這兩個手機分別提供一個充電器。這個充電器:
◆ 向上的介面相同,用於適應同一個插座;
◆ 向下的介面不同,用於適應兩個不同的手機。
在這個類比中,我們可以近似的理解兩個不同的手機就是不同的操作系統,而同一個插座就是Java位元組碼程式,充電器角色則對應JVM。類似地,我們也可以認為JVM分為向上和向下兩個部分,所有平臺上的JVM:
◆ 向上提供給Java位元組碼程式的介面完全相同;
◆ 向下適應不同平臺的介面則互不相同。
規範
Sun公司制定的Java虛擬機規範,在技術上規定了JVM的統一標準,具體定義了JVM的如下細節:
◆ 指今集
◆ 寄存器
◆ 類文件的格式
◆ 棧
◆ 存儲區
Sun公司制定這些規範的目的是為了提供統一的標準,最終實現Java程式的平臺無關性。