✔ 最佳答案
Java,是一種可以編寫跨平臺應用軟件的物件導向的程式語言,由昇陽(太陽微電子,Sun Microsystems)公司的詹姆斯·高斯林(James Gosling)等人於1990年代初開發。它最初被命名為Oak,作為一種小家用電器的編程語言,用於解決諸如電視機、電話、鬧鐘、烤麵包機等家用電器的控制和通訊問題。由於這些智能化家電的市場需求沒有預期的高,Sun放棄了該項計劃。就在Oak幾近夭折之時,隨着Internet的發展,Sun看到了Oak在電腦網絡上的廣闊應用前景,於是改造了Oak,在1995年5月以"Java"的名稱正式發佈了。Java伴隨着Internet的迅猛發展而發展,逐漸成為重要的Internet程式語言。
Java程式語言的風格十分接近C++語言。Java繼承了C++語言物件導向技術的核心,捨棄了C++語言中容易引起錯誤的指針(以引用取代)、運算符重載、多重繼承(以介面取代)等成分,增加了自動垃圾收集功能用於回收不再被引用的對象所佔據的記憶體空間。在J2SE1.5版本中Java又引入了泛型編程、類型安全的枚舉、不定長參數和自動裝/拆箱等語言特性。
Java不同於一般的編輯執行計算機語言和解釋執行電腦語言。它首先將原始碼編譯成字節碼,然後依賴各種不同平臺上的虛擬機來解釋執行字節碼,從而實現了「一次編譯、到處執行」的跨平臺特性。不過,這同時也在一定程度上降低了Java程序的運行效率。但在J2SE1.4.2發佈後,Java的計算能力有了大幅提升。
與傳統程序不同,Sun公司在推出Java之際就將其作為一種開放的技術。全球數以萬計的Java開發公司被要求所設計的Java軟件必須相互相 容。「Java語言靠群體的力量而非公司的力量」是Sun公司的口號之一,並獲得了廣大軟件開發商的認同。這與微軟公司所倡導的注重精英和封閉式的模式完 全不同。
Sun公司對Java程式語言的解釋是:Java程式語言是個簡單、物件導向、分散式、解釋性、健壯、安全與系統無關、可移植、高性能、多執行緒和動態的語言。
Java平臺是基於Java語言的平臺。這樣的平臺目前非常流行,因此微軟公司推出了與之競爭的.NET平臺以及模仿Java的C#語言。
語言特性 Java之所以被開發,是要達到以下五個目的:
應當使用物件導向程序設計方法學 應當允許同一程序在不同的電腦平臺執行 應當包括內建的對電腦網絡的支持 應當被設計成安全地執行遠端代碼 應當易於使用,並借鑒以前那些物件導向語言(如C++)的長處。 Java技術主要分成幾個部分:Java語言、運行環境JVM、類庫。一般情況下說Java時並不區分指的是哪個部分。
[編輯] 物件導向 Java的特點之一就是物件導向, 是程序設計方法的一種。「物件導向程式語言」的核心之一就是開發者在設計軟件的時候可以使用自定義的類型和關聯操作。代碼和數據的實際集合體叫做「對 象」。一個對象可以想象成綁定了很多「行為(代碼)」和「狀態(數據)」的物體。對於資料結構的改變需要和代碼進行通信然後操作,反之亦然。物件導向設計 讓大型軟件工程的計劃和設計變得更容易管理,能增強工程的健康度,減少失敗工程的數量。
物件導向設計另外一個目標就是能產生很多的有關聯的類,可以讓軟件的再開發變得簡單。舉例來說,很多軟件工程都有同樣的功能,尤其是很多應用了同一 原理組織的軟件工程。軟件的二次開發者想自己為軟件開發外掛程式以增強功能的時候,絕對不想看到混亂的開發代碼和管理計劃。物件導向的目的就是不生產難懂 且難以使用的代碼,為軟件各個功能群之間建立有效的通信通道。很多開源軟件社區正在計劃給軟件作者提供更多的類來讓軟件的二次開發變得簡便。
[編輯] 平臺無關性
圖片參考:
http://zh.wikipedia.org/skins-1.5/common/images/magnify-clip.png
一個Java軟件的界面,在所有系統下面都可以運行這個程序 Java語言的第二個特性就是平臺無關性,也就是說使用Java語言編寫的程序可以在編譯後不用經過任何更改,就能在任何硬件設備條件下運行。這個特性經常被稱為「一次編譯,到處運行」。
實現平臺無關性的方法是大多數編譯器在進行Java語言程序的編碼時候會生成一個用字節碼寫成的「半成品」,這個「半成品」會在Java虛擬機(解釋層)的幫助下運行,虛擬機會把它轉換成當前所處硬件平臺的原始代碼。之後,Java虛擬機會打開標準庫,進行數據(圖片、執行緒和網絡)的存取工作。主要注意的是,儘管已經存在一個進行代碼翻譯的解釋層,有些時候Java的字節碼代碼還是會被JIT編譯器進行二次編譯。
有些編譯器,比如GCJ,可以自動生成原始代碼而不需要解釋層。但是這些編譯器所生成的代碼只能應用於特定平臺。並且GCJ目前只支持部分的Java API。
昇陽對於Java的許可是「全相容的」,這也導致了微軟和昇陽關於微軟的程序不支持RMI和JNI介面、並且增加特性為己所用的法律爭端。昇陽最終贏得了官司,獲得了大約兩千萬美元的賠償,法院強制要求微軟執行昇陽公司關於Java的許可要求。作為回應,微軟不再在Windows系統中捆綁Java,最新的Windows版本,Windows Vista和Internet Explorer7.0版本也不再提供對於Java應用程序和控制項的支持。但是昇陽公司和其他使用Java運行時系統的公司對於微軟的操作對用戶提供無償的第三方外掛程式和程序支持。
Java語言使用解釋層最初是為了輕巧性。所以這些程序的運行效率比C語言和C++要低很多,用戶也對此頗有微詞。很多最近的調查顯示Java的程序運行速度比幾年前要高出許多,有些同樣功能的程序的效率甚至超過了C++和C語言編寫的程序。
Java語言在最開始應用的時候是沒有解釋層的,所有需要編譯的代碼都直接轉換成機器的原始代碼。這樣做的後果就是獲得了最佳的性能,但是程序臃腫 異常。從JIT技術開始,Java的程序都經過一次轉換之後才變成機器碼。很多老牌的第三方虛擬機都使用一種叫做「動態編譯」的技術,也就是說虛擬機實時 監測和分析程序的運行行為,同時選擇性地對程序所需要的部分進行編譯和優化。所有這些技術都改善了代碼的運行速度,但是又不會讓程序的體積變得失常。
程序的輕便性事實上是軟件編寫很難達到的一個目標,Java雖然成功地實現了「一次編譯,到處運行」,但是由於平臺和平臺之間的差異,所編寫的程序 在轉換代碼的時候難免會出現微小的、不可察覺的錯誤和意外。有些程式設計師對此非常頭疼,他們嘲笑Java的程序不是「一次編譯,到處運行」,而是「一次 編譯,到處調試」。
平臺無關性讓Java在伺服器端軟件領域非常成功。很多伺服器端軟件都使用Java或相關技術建立。
[編輯] 自動垃圾回收 C++語言被用戶詬病的原因之一就是大多數C++編譯器不支持垃圾收集機制。通常使用C++編程的時候,程式設計師所創建的對象在創建時在本地堆疊上分配一塊記憶體地址,當不需要這個對象,進行析構或者刪除的時候再釋放分配的記憶體地址。如果對象是在堆上分配的,而程式設計師又忘記進行地址刪除,那麼就會造成記憶體泄漏。長此以往,程序運行的時候可能會生成很多不清除的垃圾,浪費了不必要的記憶體空間。更糟糕的是,如果同一記憶體地址被刪除兩次的話,程序會變得不穩定,甚至崩潰。因此有經驗的C++程式設計師都會在刪除之後將指針重置為0,然後在刪除之前先判斷指針是否是0。
Java語言則不同,上述的情況被自動垃圾收集功能自動處理。對象的建立和放置都是在記憶體堆疊上 面進行的。程序或者其他的對象可以鎖定一塊堆疊地址來進行其他對象的引用。當一個對象沒有任何引用的時候,Java的自動垃圾收集機制就發揮作用,自動刪 除這個對象所占用的空間,釋放記憶體以避免記憶體泄漏。但是記憶體泄漏並不是就此避免了,當程式設計師疏忽大意地忘記解除一個對象不應該有的引用的時候, 記憶體泄漏仍然不可避免,不過發生的幾率要比不啟用垃圾收集機制的C++程序少很多。但是總體來講,自動垃圾收集機制要安全和簡單許多。