Java的發明人詹姆斯·高斯林java
Java的名字來自於一種咖啡的品種名稱,因此Java語言的Logo是一杯熱氣騰騰的咖啡。程序員
Java是一種普遍使用的計算機編程語言,擁有跨平臺、面向對象、泛型編程的特色,普遍應用於企業級Web應用開發和移動應用開發。編程
任職於太陽微系統的詹姆斯·高斯林等人於1990年代初開發Java語言的雛形,最初被命名爲Oak,目標設置在家用電器等小型系統的程序語言,應用在電視機、電話、鬧鐘、烤麪包機等家用電器的控制和通訊。因爲這些智能化家電的市場需求沒有預期的高,Sun公司放棄了該項計劃。隨着1990年代互聯網的發展,Sun公司看見Oak在互聯網上應用的前景,因而改造了Oak,於1995年5月以Java的名稱正式發佈。Java伴隨着互聯網的迅猛發展而發展,逐漸成爲重要的網絡編程語言。後端
Java編程語言的風格十分接近C++語言。繼承了C++語言面向對象技術的核心,Java捨棄了C++語言中容易引發錯誤的指針,改以引用取代,同時移除原C++與原來運算符重載,也移除多重繼承特性,改用接口取代,增長垃圾回收器功能。在Java SE 1.5版本中引入了泛型編程、類型安全的枚舉、不定長參數和自動裝/拆箱特性。太陽微系統對Java語言的解釋是:「Java編程語言是個簡單、面向對象、分佈式、解釋性、健壯、安全與系統無關、可移植、高性能、多線程和動態的語言」瀏覽器
Java不一樣於通常的編譯語言或直譯語言。它首先將源代碼編譯成字節碼,而後依賴各類不一樣平臺上的虛擬機來解釋執行字節碼,從而實現了「一次編寫,處處運行」的跨平臺特性。在早期JVM中,這在必定程度上下降了Java程序的運行效率。但在J2SE1.4.2發佈後,Java的運行速度有了大幅提高。安全
與傳統類型不一樣,Sun公司在推出Java時就將其做爲開放的技術。全球數以萬計的Java開發公司被要求所設計的Java軟件必須相互兼容。「Java語言靠羣體的力量而非公司的力量」是 Sun公司的口號之一,並得到了廣大軟件開發商的認同。這與微軟公司所倡導的注重精英和封閉式的模式徹底不一樣,此外,微軟公司後來推出了與之競爭的.NET平臺以及模仿Java的C#語言。後來Sun公司被甲骨文公司併購,Java也隨之成爲甲骨文公司的產品。服務器
現時,移動操做系統Android大部分的代碼採用Java 編程語言編程。網絡
Java 發展史數據結構
語言最開始只是Sun計算機(Sun MicroSystems)公司在1990年12月開始研究的一個內部項目。Sun計算機公司的一個叫作帕特里克·諾頓的工程師被公司本身開發的C++和Duke,Java語言的吉祥物C語言編譯器搞得焦頭爛額,由於其中的API極其難用。帕特里克決定改用NeXT,同時他也得到了研究公司的一個叫作「Stealth計劃」的項目的機會。「Stealth計劃」後來更名爲「Green計劃」,詹姆斯·高斯林和麥克·舍林丹也加入了帕特里克的工做小組。他們和其餘幾個工程師一塊兒在加利福尼亞州門羅帕克市沙丘路的一個小工做室裏面研究開發新技術,瞄準下一代智能家電(如微波爐)的程序設計,Sun公司預料將來科技將在家用電器領域大顯身手。團隊最初考慮使用C++語言,可是不少成員包括Sun的首席科學家比爾·喬伊,發現C++和可用的API在某些方面存在很大問題。多線程
工做小組使用的是嵌入式系統,能夠用的資源極其有限。不少成員發現C++太複雜以致不少開發者常常錯誤使用。他們發現C++缺乏垃圾回收系統,還有可移植的安全性、分佈程序設計、和多線程功能。最後,他們想要一種易於移植到各類設備上的平臺。
根據可用的資金,喬伊決定開發一種集C語言和Mesa語言大成的新語言,在一份報告上,喬伊把它叫作「將來」,他提議Sun公司的工程師應該在C++的基礎上,開發一種面向對象的環境。最初,高斯林試圖修改和擴展C++的功能,他本身稱這種新語言爲C++ ++ –,可是後來他放棄了。他將要創造出一種全新的語言,被他命名爲「Oak」(橡樹),以他的辦公室外的橡樹命名。
就像不少開發新技術的祕密工程同樣,工做小組沒日沒夜地工做到了1993年的夏天,他們可以演示新平臺的一部分了,包括Green操做系統,Oak的程序設計語言,類庫及其硬件。最初的嘗試是面向一種類PDA設備,被命名爲Star7,這種設備有鮮豔的圖形界面和被稱爲「Duke」的智能代理來幫助用戶。1992年12月3日,這臺設備進行了展現。
同年11月,Green計劃被轉化成了「FirstPerson有限公司」,一個Sun公司的全資子公司,團隊也被從新安排到了帕洛阿爾託。FirstPerson團隊對建造一種高度交互的設備感興趣,當時代華納發佈了一個關於電視機頂盒的徵求提議書時(Request for proposal),FirstPerson改變了他們的目標,做爲對徵求意見書的響應,提出了一個機頂盒平臺的提議。可是有線電視業界以爲FirstPerson的平臺給予用戶過多的控制權,所以FirstPerson的投標敗給了SGI。與3DO公司的另一筆關於機頂盒的交易也沒有成功,因爲他們的平臺不能在電視工業產生任何效益,公司被並回Sun公司。
Java和互聯網
1994年6月,在經歷了一場歷時三天的腦力激盪的討論後,約翰·蓋吉、詹姆斯·高斯林、比爾·喬伊、帕特里克·諾頓、韋恩·羅斯因和埃裏克·斯庫米,團隊決定再一次改變努力的目標,此次他們決定將該技術應用於萬維網。他們認爲隨着Mosaic瀏覽器的到來,因特網正在向一樣的高度互動的遠景演變,而這一遠景正是他們在有線電視網中看到的。做爲原型,帕特里克·諾頓寫了一個小型萬維網瀏覽器,WebRunner,後來更名爲HotJava。
1994年10月,HotJava和Java平臺爲公司高層進行演示。1994年,Java 1.0a版本已經能夠提供下載,可是Java和HotJava瀏覽器的第一次公開發布倒是在1995年3月23日SunWorld大會上進行的。昇陽公司的科學指導約翰·蓋吉宣告Java技術。這個發佈是與網景公司的執行副總裁馬克·安德森的驚人發佈一塊兒進行的,宣佈網景將在其瀏覽器中包含對Java的支持。1996年1月,昇陽公司成立了Java業務集團,專門開發Java技術。
Java和「Java」
因爲商標搜索顯示,Oak已被一家顯示卡製造商註冊。因而同年,Oak被更名爲Java。當使用十六進制編輯器打開由Java源代碼編譯出的二進制文件(.class文件)的話,最前面的32位將顯示爲CA FE BA BE,即詞組「CAFE BABE」(咖啡屋寶貝)。
JSPX網頁的概念
在流行幾年以後,Java在瀏覽器中的地位被逐步侵蝕。它在簡單交互性動畫方面的用途已經徹底被Adobe公司的Flash排擠,2005年Java傾向只被用於雅虎遊戲那樣的更爲複雜的應用程序。Java同時遭受到來自微軟的反對,他們決定在新版本的Internet Explorer和Windows中再也不附帶Java平臺。
與此相反,在萬維網的服務器端和手持設備上,Java變得更加流行。不少網站在後端使用JSP和其餘的Java技術。
在桌面系統上,獨立的Java程序仍是相對少見,這是由於Java平臺的運行開銷較大,而許多人的電腦上沒有安裝Java,因爲網絡帶寬在之前較小,下載Java曾經是個耗時的事情。可是隨着計算機計算能力、網絡帶寬在10年中獲取了很大的進步,同時虛擬機和編譯器的質量獲得了提升,許多應用程序獲得了普遍的使用,包括:
開源軟件:
NetBeans和Eclipse等軟件開發工具
Android操做系統
JEdit
Azureus BitTorrent客戶端。
JNode操做系統
Apache軟件基金會的Ant、Derby、Hadoop、Jakarta、POI和Tomcat
JBoss和GlassFish應用服務器
商業軟件:
EIOffice(永中Office)
Minecraft
純Java 3D遊戲合金戰士Chrome
IBM Websphere、ColdFusion和WebLogic
IntelliJ IDEA
還有許多用Java寫的軟件,能夠在http://www.java.com 找到。在如下網頁能夠看到很是多用Java寫的程序:http://java.sun.com/products/ 下面有大量用Java Swing開發的桌面Java程序 http://java.sun.com/products/jfc/tsc/sightings/ 目前Java提供如下三個版本:
Java Platform, Enterprise Edition(Java EE:Java平臺企業版)
Java Platform, Standard Edition(Java SE:Java平臺標準版)
Java Platform, Micro Edition(Java ME:Java平臺微型版)
Java Platform, Card Edition
Java開放源代碼項目
2006年SUN在JavaOne公佈Java 開放源代碼項目,並推出OpenJDK項目[13]。Java虛擬機、Java編譯器和Java類庫以GNU通用公共許可證公開。
版本歷史
主條目:Java版本歷史
1995年5月23日,Java語言誕生
1996年1月,第一個JDK–JDK1.0誕生
1996年4月,10個最主要的操做系統供應商申明將在其產品中嵌入JAVA技術
1996年9月,約8.3萬個網頁應用了JAVA技術來製做
1997年2月18日,JDK1.1發佈
1997年4月2日,JavaOne會議召開,參與者逾一萬人,創當時全球同類會議規模之紀錄
1997年9月,JavaDeveloperConnection社區成員超過十萬
1998年2月,JDK1.1被下載超過2,000,000次
1998年12月8日,JAVA2企業平臺J2EE發佈
1999年6月,SUN公司發佈Java的三個版本:標準版(J2SE)、企業版(J2EE)和微型版(J2ME)
2000年5月8日,JDK1.3發佈
2000年5月29日,JDK1.4發佈
2001年6月5日,NOKIA宣佈,到2003年將出售1億部支持Java的手機
2001年9月24日,J2EE1.3發佈
2002年2月26日,J2SE1.4發佈,自此Java的計算能力有了大幅提高
2004年9月30日18:00PM,J2SE1.5發佈,成爲Java語言發展史上的又一里程碑。爲了表示該版本的重要性,J2SE1.5改名爲Java SE 5.0(由於新特新增長特別多,因此起了個高大上的名字!)
2005年6月,JavaOne大會召開,SUN公司公開Java SE 6。此時,Java的各類版本已經改名,以取消其中的數字「2」:J2EE改名爲Java EE,J2SE改名爲Java SE,J2ME改名爲Java ME
2006年12月,SUN公司發佈JRE6.0
2009年12月,SUN公司發佈Java EE 6
2010年11月,因爲Oracle公司對於Java社區的不友善,所以Apache揚言將退出JCP
2011年7月28日,Oracle公司發佈Java SE 7
2014年3月18日,Oracle公司發表Java SE 8(市場主流版本)
2017年9月21日,Oracle公司發表Java SE 9
語言特性
Java之因此被開發,是要達到如下五個目的:
應當使用面向對象程序設計方法學
應當容許同一程序在不一樣的計算機平臺執行
應當包括內建的對計算機網絡的支持
應當被設計成安全地執行遠端代碼
應當易於使用,並借鑑之前那些面嚮對象語言(如C++)的長處。
Java技術主要分紅幾個部分:Java語言、Java運行環境、類庫。通常狀況下說Java時並不區分指的是哪一個部分。
Java在1.5版本時,作了重大改變,Sun公司並1.5版本重命名爲Java 5.0。
面向對象
Java的特色之一就是面向對象,是程序設計方法的一種。「面向對象程序設計語言」的核心之一就是開發者在設計軟件的時候可使用自定義的類型和關聯操做。代碼和數據的實際集合體叫作「對象」。一個對象能夠想象成綁定了不少「行爲(代碼)」和「狀態(數據)」的物體。對於數據結構的改變須要和代碼進行通訊而後操做,反之亦然。面向對象設計讓大型軟件工程的計劃和設計變得更容易管理,能加強工程的健康度,減小失敗工程的數量。
跨平臺性
Java語言的第二個特性就是跨平臺性,也就是說使用Java語言編寫的程序能夠在編譯後不用通過任何更改,就能在任何硬件設備條件下運行。這個特性常常被稱爲「一次編譯,處處運行」。
執行Java應用程序必須安裝爪哇運行環境(Java Runtime Environment,JRE),JRE內部有一個Java虛擬機(Java Virtual Machine,JVM)以及一些標準的類庫(Class Library)。經過JVM才能在電腦系統執行Java應用程序(Java Application),這與.Net Framework的狀況同樣,因此電腦上沒有安裝JVM,那麼這些程序將不可以執行。
實現跨平臺性的方法是大多數編譯器在進行Java語言程序的編碼時候會生成一個用字節碼寫成的「半成品」,這個「半成品」會在Java虛擬機(解釋層)的幫助下運行,虛擬機會把它轉換成當前所處硬件平臺的原始代碼。以後,Java虛擬機會打開標準庫,進行數據(圖片、線程和網絡)的訪問工做。主要注意的是,儘管已經存在一個進行代碼翻譯的解釋層,有些時候Java的字節碼代碼仍是會被JIT編譯器進行二次編譯。
有些編譯器,好比GCJ,能夠自動生成原始代碼而不須要解釋層。可是這些編譯器所生成的代碼只能應用於特定平臺。而且GCJ目前只支持部分的Java API。
甲骨文公司對於Java的許但是「全兼容的」,這也致使了微軟和昇陽關於微軟的程序不支持RMI和JNI接口、而且增長特性爲己所用的法律爭端。昇陽最終贏得了官司,得到了大約兩千萬美圓的賠償,法院強制要求微軟執行昇陽公司關於Java的許可要求。做爲迴應,微軟再也不在Windows系統中捆綁Java,最新的Windows版本,Windows Vista和Internet Explorer 7.0版本也再也不提供對於Java應用程序和控件的支持。可是昇陽公司和其餘使用Java運行時系統的公司在Windows操做系統下對用戶提供無償的第三方插件和程序支持。
Java語言使用解釋層最初是爲了輕巧性。因此這些程序的運行效率比C語言和C++要低不少,用戶也對此很有微詞。不少最近的調查顯示Java的程序運行速度比幾年前要高出許多,有些一樣功能的程序的效率甚至超過了C++和C語言編寫的程序。
Java語言在最開始應用的時候是沒有解釋層的,全部須要編譯的代碼都直接轉換成機器的原始代碼。這樣作的後果就是得到了最佳的性能,可是程序臃腫異常。從JIT技術開始,Java的程序都通過一次轉換以後才變成機器碼。不少老牌的第三方虛擬機都使用一種叫作「動態編譯」的技術,也就是說虛擬機實時監測和分析程序的運行行爲,同時選擇性地對程序所須要的部分進行編譯和優化。全部這些技術都改善了代碼的運行速度,可是又不會讓程序的體積變得失常。
程序的輕便性事實上是軟件編寫很難達到的一個目標,Java雖然成功地實現了「一次編譯,處處運行」,可是因爲平臺和平臺之間的差別,所編寫的程序在轉換代碼的時候不免會出現微小的、不可察覺的錯誤和意外。有些程序員對此很是頭疼,他們嘲笑Java的程序不是「一次編譯,處處運行」,而是「一次編譯,處處調試」。以Java AWT爲例,早期Java AWT內提供的按鈕、文字區等均是以計算機系統所默認的樣式而顯示。這令Java程序在有些沒有提供圖案的計算機系統產生錯誤(在Microsoft Windows設有窗口管理器,在一些Linux distribution則沒有)。後來SUN公司針對Java AWT一些問題而推出Java Swing。
平臺無關性讓Java在服務器端軟件領域很是成功。不少服務器端軟件都使用Java或相關技術創建。
自動垃圾回收(Garbage Collection)
C++語言被用戶詬病的緣由之一是大多數C++編譯器不支持垃圾收集機制。一般使用C++編程的時候,程序員於程序中初始化對象時,會在主機內存堆棧上分配一塊內存與地址,當不須要此對象時,進行析構或者刪除的時候再釋放分配的內存地址。若是對象是在堆棧上分配的,而程序員又忘記進行刪除,那麼就會形成內存泄漏(Memory Leak)。久而久之,程序運行的時候可能會生成不少不清除的垃圾,浪費了沒必要要的內存空間。並且若是同一內存地址被刪除兩次的話,程序會變得不穩定,甚至崩潰。所以有經驗的C++程序員都會在刪除以後將指針重置爲NULL,而後在刪除以前先判斷指針是否爲NULL。
C++中也可使用「智能指針」(Smart Pointer)或者使用C++託管擴展編譯器的方法來實現自動化內存釋放,智能指針能夠在標準類庫中找到,而C++託管擴展被微軟的Visual C++ 7.0及以上版本所支持。智能指針的優勢是不需引入緩慢的垃圾收集機制,並且能夠不考慮線程安全的問題,可是缺點是若是不善使用智能指針的話,性能有可能不如垃圾收集機制,並且不斷地分配和釋放內存可能形成內存碎片,須要手動對堆進行壓縮。除此以外,因爲智能指針是一個基於模板的功能,因此沒有經驗的程序員在須要使用多態特性進行自動清理時也可能一籌莫展。
Java語言則不一樣,上述的狀況被自動垃圾收集功能自動處理。對象的建立和放置都是在內存堆棧上面進行的。當一個對象沒有任何引用的時候,Java的自動垃圾收集機制就發揮做用,自動刪除這個對象所佔用的空間,釋放內存以免內存泄漏。
注意程序員不須要修改finalize
方法,自動垃圾收集也會發生做用。可是內存泄漏並非就此避免了,當程序員疏忽大意地忘記解除一個對象不該該有的引用時,內存泄漏仍然不可避免。
不一樣廠商、不一樣版本的JVM中的內存垃圾回收機制並不徹底同樣,一般越新版本的內存回收機制越快,IBM、BEA、SUN等等開發JVM的公司都曾宣稱過本身製造出了世界上最快的JVM[來源請求],JVM性能的世界紀錄也在不斷的被打破並提升。
IBM有一篇有關Java內存回收機制比不激活垃圾收集機制的C++內存處理快數倍的技術文章[15],而著名的Java技術書籍《Java編程思想》(Thinking in Java)也有一段論述Java內存及性能達到甚至超過C++的章節[16]。
基本語法
編寫Java程序前應注意如下幾點:
大小寫敏感:Java是大小寫敏感的,這就意味着標識符Hello與hello是不一樣的。
類名:對於全部的類來講,類名的首字母應該大寫。若是類名由若干單詞組成,那麼每一個單詞的首字母應該大寫,例如MyFirstJavaClass。
方法名:全部的方法名都應該以小寫字母開頭。若是方法名含有若干單詞,則後面的每一個單詞首字母大寫,例如myFirstJavaMethod。
源文件名:源文件名必須和類名相同。當保存文件的時候,你應該使用類名做爲文件名保存(切記Java是大小寫敏感的),文件名的後綴爲.java。(若是文件名和類名不相同則會致使編譯錯誤)。
主方法入口:全部的Java程序由public static void main(String[] args)方法開始執行。