Java是一種計算機編程語言,擁有跨平臺、面向對象、泛型編程的特性,廣泛應用于企業級Web應用開發和移動應用開發。
1991 年Sun公司的James Gosling等人開始開發名稱為 Oak 的語言。希望用于控制嵌入在有線電視交換盒、PDA等的微處理器
1994年將Oak語言更名為Java
1998年JDK1.2時,更名為Java 2 Platform
分為標準版J2SE,企業版J2EE,微型版J2ME
Java 既安全、可移植,又可跨平臺,而且人們發現它能夠解決Internet 上的大型應用問題
Internet使Java成為網上流行的編程語言
Java對Internet的影響也意義深遠
B/S的興起 & C/S的沒落
任職于太陽微系統的詹姆斯•高斯林等人于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也隨之成為甲骨文公司的產品。
Java語言之父-詹姆斯•高斯林
語言特性
Java之所以被開發,是要達到以下五個目的:
應當使用面向對象程序設計方法學
應當允許同一程序在不同的計算機平臺執行
應當包括內建的對計算機網絡的支持
應當被設計成安全地執行遠端代碼
應當易于使用,并借鑒以前那些面向對象語言(如C++)的長處。
Java技術主要分成幾個部分:Java語言、Java運行環境、類庫。一般情況下說Java時并不區分指的是哪個部分。
Java在1.5版本時,做了重大改變,太陽公司并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++內存處理快數倍的技術文章[14],而著名的Java技術書籍《Java編程思想》(Thinking in Java)也有一段論述Java內存及性能達到甚至超過C++的章節[15] 。
基本語法
編寫Java程序前應注意以下幾點:
大小寫敏感:Java是大小寫敏感的,這就意味著標識符Hello與hello是不同的。
類名:對于所有的類來說,類名的首字母應該大寫。如果類名由若干單詞組成,那么每個單詞的首字母應該大寫,例如MyFirstJavaClass。
方法名:所有的方法名都應該以小寫字母開頭。如果方法名含有若干單詞,則后面的每個單詞首字母大寫,例如myFirstJavaMethod。
源文件名:源文件名必須和類名相同。當保存文件的時候,你應該使用類名作為文件名保存(切記Java是大小寫敏感的),文件名的后綴為.java。(如果文件名和類名不相同則會導致編譯錯誤)。(相關推薦:為什么要學習Java?Java有哪些特點)
主方法入口:所有的Java程序由public static void main(String[] args)方法開始執行。