Java程序设计语言

**Java** 是一種廣泛使用的電腦程式設計語言，擁有跨平台、物件導向、泛型程式設計的特性，廣泛應用於企業級 Web 應用開發和行動應用開發。

任職於昇陽電腦的詹姆斯・高斯林等人於 1990 年代初開發 Java 語言的雛形，最初被命名為 Oak，目標設定在家用電器等小型系統的程式語言，應用在電視機、電話、鬧鐘、烤麵包機等家用電器的控制和通訊。由於這些智慧型家電的市場需求沒有預期的高，昇陽電腦放棄了該項計劃。隨著 1990 年代網際網路的發展，昇陽電腦看見 Oak 在網際網路上應用的前景，於是改造了 Oak，於 1995 年 5 月以 Java 的名稱正式釋出。Java 伴隨著網際網路的迅猛發展而發展，逐漸成為重要的網路程式語言。

Java 程式語言的風格十分接近 C++ 語言。繼承了 C++ 語言物件導向技術的核心，捨棄了容易引起錯誤的指標，以參照取代；移除了 C++ 中的運算子重載和多重繼承特性，用介面取代；增加垃圾回收器功能。在 Java SE 1.5 版本中引入了泛型程式設計、類型安全的列舉、不定長參數和自動裝 / 拆箱特性。昇陽電腦對 Java 語言的解釋是：「Java 程式語言是個簡單、物件導向、分散式、解釋性、健壯、安全、與系統無關、可移植、高效能、多執行緒和動態的語言」。

Java 不同於一般的編譯語言或直譯語言。它首先將原始碼編譯成位元組碼，再依賴各種不同平台上的虛擬機器來解釋執行位元組碼，從而具有「一次編寫，到處執行」的跨平台特性。在早期 JVM 中，這在一定程度上降低了 Java 程式的執行效率。但在 J2SE1.4.2 釋出後，Java 的執行速度有了大幅提升。

與傳統型態不同，昇陽電腦在推出 Java 時就將其作為開放的技術。全球的 Java 開發公司被要求所設計的 Java 軟體必須相容。「Java 語言靠群體的力量而非公司的力量」是昇陽電腦的口號之一，並獲得了廣大軟體開發商的認同。這與微軟公司所倡導的注重精英和封閉式的模式完全不同，此外，微軟公司後來推出了與之競爭的.NET 平台以及模仿 Java 的 C# 語言。後來昇陽電腦被甲骨文公司併購，Java 也隨之成為甲骨文公司的產品。

目前，行動作業系統 Android 大部分的代碼採用 Java 程式設計語言編程。

## 歷史

### 早期的 Java

語言最開始只是昇陽電腦（Sun MicroSystems）公司在 1990 年 12 月開始研究的一個內部項目。昇陽電腦公司的一個叫做派屈克・諾頓的工程師被公司自己開發的 C++ 和 C 語言編譯器搞得焦頭爛額，因為其中的 API 極其難用。派屈克決定改用 NeXT，同時他也獲得了研究公司的一個叫做 **「Stealth 計劃」** 的項目的機會。

「Stealth 計劃」後來改名為「**Green 計劃**」，詹姆斯・高斯林和麥克・舍林丹（Mike Sheridan）也加入了派屈克的工作小組。他們和其他幾個工程師一起在加利福尼亞州門羅帕克市沙丘路的一個小工作室裡面研究開發新技術，瞄準下一代智慧型家電（如微波爐）的程式設計，昇陽電腦預料未來科技將在家用電器領域大顯身手。團隊最初考慮使用 C++ 語言，但是很多成員包括昇陽電腦的首席科學家比爾・喬伊，發現 C++ 和可用的 API 在某些方面存在很大問題。

工作小組使用的是嵌入式系統，可以用的資源極其有限。很多成員發現 C++ 太複雜以至很多開發者經常錯誤使用。他們發現 C++ 缺少垃圾回收系統，還有可移植的安全性、分佈程式設計、和多執行緒功能。最後，他們想要一種易於移植到各種裝置上的平台。

根據可用的資金，喬伊決定開發一種集 C 語言和 Mesa 語言大成的新語言，在一份報告上，喬伊把它叫做「未來」，他提議昇陽電腦的工程師應該在 C++ 的基礎上，開發一種物件導向的環境。最初，高斯林試圖修改和擴展 C++ 的功能，他自己稱這種新語言為 C++ -- ，但是後來他放棄了。他將要創造出一種全新的語言，被他命名為「**Oak**」（橡樹），以他的辦公室外的橡樹命名。

就像很多開發新技術的秘密工程一樣，工作小組沒日沒夜地工作到了 1993 年的夏天，他們能夠演示新平台的一部分了，包括 Green 作業系統，Oak 的程式設計語言，類庫及其硬體。最初的嘗試是面向一種類 PDA 裝置，被命名為 **Star7**，這種裝置有鮮豔的圖形介面和被稱為「Duke」的智慧型代理來幫助使用者。1992 年 12 月 3 日，這台裝置進行了展示。

同年 11 月，Green 計劃被轉化成了「**FirstPerson 有限公司**」，一個昇陽電腦的全資子公司，團隊也被重新安排到了帕洛阿爾托。FirstPerson 團隊對建造一種高度互動的裝置感興趣，當時代華納發佈了一個關於電視機上盒的徵求提議書時（Request for proposal），FirstPerson 改變了他們的目標，作為對徵求意見書的響應，提出了一個機上盒平台的提議。但是有線電視業界覺得 FirstPerson 的平台給予使用者過多的控制權，因此 FirstPerson 的投標敗給了 SGI。與 3DO 公司的另外一筆關於機上盒的交易也沒有成功，由於他們的平台不能在電視工業產生任何效益，公司被併回昇陽電腦。

### Java 和「Java」

由於商標搜尋顯示 Oak 已被一家顯示卡製造商註冊。於是同年，Oak 被改名為 **Java**。當使用十六進位編輯器打開由 Java 原始碼編譯出的二進位檔案（.class 檔案）的話，最前面的 32 位元將顯示為 CA FE BA BE，即詞組「CAFE BABE」（咖啡屋寶貝）。

### 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 在瀏覽器中的地位被逐步侵蝕。它在簡單互動性動畫方面的用途已經完全被 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 提供以下三個版本：

* 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 年昇陽電腦在 JavaOne 公佈 Java 開放原始碼項目，並推出 OpenJDK 計劃。Java 虛擬機、Java 編譯器和 Java 類庫以 GNU 通用公眾授權條款公開。

### 版本歷史

* 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 月，昇陽電腦釋出 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 大會召開，昇陽電腦公開 Java SE 6。此時，Java 的各種版本已經更名，以取消其中的數字「2」：J2EE 更名為 Java EE，J2SE 更名為 Java SE，J2ME 更名為 Java ME
* 2006 年 12 月，昇陽電腦釋出 JRE6.0
* 2009 年 12 月，昇陽電腦釋出 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
* 2018 年 3 月 21 日，Oracle 公司釋出 Java SE 10
* 2018 年 9 月 25 日，Oracle 公司釋出 Java SE 11 (LTS)
* 2019 年 3 月，Oracle 公司釋出 Java SE 12
* 2019 年 9 月，Oracle 公司釋出 Java SE 13
* 2020 年 3 月，Oracle 公司釋出 Java SE 14
* 2020 年 9 月，Oracle 公司釋出 Java SE 15
* 2021 年 3 月，Oracle 公司釋出 Java SE 16
* 2021 年 9 月，Oracle 公司釋出 Java SE 17
* 2022 年 3 月，Oracle 公司釋出 Java SE 18
* 2022 年 9 月，Oracle 公司釋出 Java SE 19

## 語言特性

Java 之所以被開發，是要達到以下五個目的：

* 應當使用物件導向程式設計方法學
* 應當允許同一程式在不同的電腦平台執行
* 應當包括內建的對電腦網路的支援
* 應當被設計成安全地執行遠端程式碼
* 應當易於使用，並借鑑以前那些物件導向語言（如 C++）的長處。

Java 技術主要分成幾個部分：Java 語言、Java 執行環境、類別館。一般情況下說 Java 時並不區分指的是哪個部分。

Java 在 1.5 版本時，做了重大改變，昇陽電腦並 1.5 版本重新命名為 Java 5.0。

### 物件導向

Java 的特點之一就是物件導向，是程式設計方法的一種。「物件導向程式設計語言」的核心之一就是開發者在設計軟體的時候可以使用自訂的類型和關聯操作。程式碼和資料的實際集合體叫做「物件」。一個物件可以想像成繫結了很多「行為（程式碼）」和「狀態（資料）」的物體。對於資料結構的改變需要和程式碼進行通信然後操作，反之亦然。物件導向設計讓大型軟體工程的計劃和設計變得更容易管理，能增強工程的健康度，減少失敗工程的數量。

### 跨平台性

跨平台性是 Java 主要的特性之一，跨平台使得用 Java 語言編寫的程式可以在編譯後不用經過任何更改，就能在任何硬體裝置條件下執行。這個特性經常被稱為「一次編譯，到處執行」。

執行 Java 應用程式必須安裝 **Java 執行時環境**（Java Runtime Environment，JRE），JRE 包括 Java 虛擬機器（Java Virtual Machine，JVM），以及 Java 平台核心類和基礎 Java 平台庫。通過 JVM 才能在電腦系統執行 Java 應用程式（Java Application），這與**.Net Framework** 的情況一樣，所以電腦上沒有安裝 JVM，那麼這些 java 程式將不能夠執行。

實現跨平台性的方法是大多數編譯器在進行 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 語言在最開始應用的時候是沒有解釋層的，所有需要編譯的程式碼都直接轉換成機器的原始程式碼。這樣做雖然使程式獲得了最佳的效能，但是導致程式異常臃腫。從 JIT 技術開始，Java 的程式都經過一次轉換之後才變成機器碼。很多老牌的第三方虛擬機器都使用一種叫做「動態編譯」的技術，也就是說虛擬機器即時監測和分析程式的執行行為，同時選擇性地對程式所需要的部分進行編譯和最佳化。所有這些技術都改善了程式碼的執行速度，但是又不會讓程式的體積變得失常。

程式的輕便性事實上是軟體編寫很難達到的一個目標，Java 雖然成功地實現了「一次編譯，到處執行」，但是由於平台和平台之間的差異，所編寫的程式在轉換程式碼的時候難免會出現微小的、不可察覺的錯誤和意外。有些程式設計師對此非常頭疼，他們嘲笑 Java 的程式不是「一次編譯，到處執行」，而是「一次編譯，到處除錯」。以 Java AWT 為例，早期 Java AWT 內提供的按鈕、文字區等均是以電腦系統所預設的樣式而顯示。這令 Java 程式在有些沒有提供圖案的電腦系統產生錯誤（在 Microsoft Windows 設有視窗管理員，在一些 Linux distribution 則沒有）。後來昇陽電腦針對 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、昇陽電腦等等開發 JVM 的公司都曾宣稱過自己製造出了世界上最快的 JVM，JVM 效能的世界紀錄也在不斷的被打破並提高。

IBM 有一篇有關 Java 記憶體回收機制比不啟用垃圾收集機制的 C++ 記憶體處理快數倍的技術文章，而著名的 Java 技術書籍《Java 編程思想》（_Thinking in Java_）也有一段論述 Java 記憶體及效能達到甚至超過 C++ 的章節。

### 基本語法

編寫 Java 程式前應注意以下幾點：

* **大小寫敏感**：Java 是大小寫敏感的，這就意味著識別碼 `Hello` 與 `hello` 是不同的。
* **類名**：對於所有的類來說，類名的首字母應該大寫。如果類名由若干單詞組成，那麼每個單詞的首字母應該大寫，例如 `**MyFirstJavaClass**`。
* **方法名**：所有的方法名都應該以小寫字母開頭。如果方法名含有若干單詞，則後面的每個單詞首字母大寫，例如 `**myFirstJavaMethod**`。
* **原始檔名**：原始檔名必須和檔案內名字唯一且公開 (由 public 關鍵詞修飾) 的類名相同。當儲存檔案的時候，你應該使用該類名作為檔名儲存（切記 Java 是大小寫敏感的），檔名的字尾為 `.java`。（如果檔名和類名不相同則會導致編譯錯誤）。
* **主方法入口**：所有的 Java 程式由 `public static void main(String[] args)` 方法開始執行。

### Java 關鍵字

下面列出了 Java 關鍵字。這些關鍵字不能用於常數、變數、和任何識別碼的名稱。

**注釋**

注釋的作用：標識程式是幹什麼的，以及它是如何構建的。注釋幫助程式設計師進行相互溝通以及理解程式。注釋不是程式設計語言，所以編譯器編譯程式時忽略它們。

### 介面和類別

Java 內建了建立介面的類別，可以這樣使用：

這段程式碼的意思是任何實現（implement）`Deleteable` 介面的類別都必須實現 `delete()` 方法。每個類別對這個方法的實現可以自行客製化。由此概念可以引出很多種使用方法，下面是一個類別的例子：

在另外一個類別中，可以使用這樣的程式碼：

因為佇列中所有的物件都可以使用 `delete()` 方法。`Deleteable` 佇列中包含 `Fred` 物件的參照，而這個類別和其他 `Deleteable` 類別在使用 `deleteAll()` 方法時候不需要進行任何改變。

之所以這樣做就是為了在介面的執行和其程式碼之間進行區別。舉例來說，一個名叫 `Collection` 的介面可以包含任何物件所需要的引入、轉換和儲存資料的方法，其他的類都可以使用這個介面。但是這個介面可以是一個可重定義大小的佇列、一個連結串列或者是其他功能的集合。

這種特性其實是一種折中的辦法。Java 的設計者們不想讓 Java 有多重繼承的特性，因為 C++ 的多重繼承顯示了這種特性的困難。Java 的介面功能可以提供同樣的功能，但是又不會很複雜。

### 應用程式開發介面

在 Java 語言中，應用程式介面（API）化身成類別，並且分組成為套件。每個包中包含有相關的介面和類。對於不同的平台，Java 提供了不同版本的包。API 的設定由昇陽電腦和其他公司通過 JCP（Java 社群程式）決定。任何公司和個人都可以參與這個工程，對 API 進行設計。2004 年，IBM 和 BEA 公司準備聯合對官方的 Java 開源軟體工程進行支援，但是 2005 年初，昇陽電腦拒絕了這個支援。

## Hello World

下面這個程式顯示「Hello world!」然後結束執行，注意 `java.lang` 套件是自動載入的，所以不需要在程式之前加入 `import java.lang.*;`

## 關於 Java 的批評

Java 試圖通過新的方式解決軟體編寫的複雜性。很多人認為 Java 語言做到了它承諾的一切，然而，某些情況下，Java 會將簡單問題導向複雜化。儘管 Java 並不是一門完美的語言，但它的出現確實給大規模軟體協同開發提供了新的思路。

### 整體性問題

並不是所有的工程和環境需要企業等級的複雜性，比如一個簡單的個人網站或者獨自編程的程式師所寫的程式。這些程式師會發現 Java 的複雜管理對於自己要做的程式來說過於強大了。一些人覺得 Java 在物件導向上面做的沒有 Ruby 和 Smalltalk 純粹。但是最新出現的用 Java 實現的語言 Groovy 解決了這些問題。

作為一種已經建立的新技術，Java 顯然綜合了很多語言的特性，比如 C++、C 語言、Python 等等。一些對於 Java 的評論認為 Java 的不變性在動搖。

### 語言問題

有些程式師不喜歡原始類型（primitive type）和類別（class）的分離，尤其是那些曾經使用過 Smalltalk 和 Ruby 的程式設計師。Java 的代碼相對於其他的代碼來說過於冗長，這與它的輕便化聲明相違背。此外 Java 一般也會默認式的自動植入過多的標準庫代碼，導致整體運行會出現緩慢

Java 是一種單繼承的語言。這也導致了程式師在試圖使用多重繼承時候的不便，而很多語言都可以使用這個特性。但是 Java 可以使用介面類，把多重繼承可能導致的風險減少到最小。Java 不支援運算子重載，這是為了防止運算子重載使得代碼的功能變得不清晰。但是用 Java 實現的語言 Groovy 可以進行運算子重載。過去 Java 對於文字的操作和其他語言，比如 Perl 和 PHP 相比差的較多，但 Java 在 1.4 版本時候引入了正規表示式。

至 Java 1.7 為止，Java 語言不支援閉包（closure）和混入（mixin）特性。

Java 1.8 加入 lambda 表達式（Lambda Expressions）。

### 類庫問題

使用 Swing 平臺編寫的帶有 GUI（圖形使用者介面）的程式和其他原始程式非常不同。選用 AWT 工具包編寫程式的程式師看到的都是原始介面，而且也無法獲得先進的 GUI 編程支援，如果使用的話，就要提供每個平臺上面所需的 API，這將是一項龐大的工程。Swing 則是完全用 Java 語言所寫的程式，避免了介面元素重複的問題，只使用所有平臺都支援的最基本的繪圖機制。但是很多使用者不知道如何在 Java 風格和 Windows 風格之間進行轉換，結果造成了 Java 程式的介面在很多程式中非常特殊。蘋果電腦已經提供了優化過的 Java 運行時程式，包含了 Mac OS X 的經典 Aqua 介面風格。

在 IBM 捐贈給 Eclipse 基金會的 SWT 介面框架中，使用者會看到熟悉的本地風格介面。但這又引起了不同喜好的開發人員之間的爭論。

### 效能問題

由於 Java 編譯器和虛擬機的不同對 Java 代碼的效能影響比語言本身的影響大的多，所以統一討論 Java 的程式的效能經常是有誤導性的。據 IBM 的資料，在同樣的硬體上 2001 年時的 IBM JDK 版本的效能是 1996 年的 JDK 版本的十倍左右。而即使是在同一時期，不同公司的 JDK 和 JRE 的效能也不一樣，比如昇陽電腦、IBM、BEA 等公司都有自己開發的 JDK 和 JRE。

Java 語言的一些特性不可避免的有額外的效能代價，例如陣列範圍檢查、運行時類型檢查等等。Java 程式的效能還會因為不同的動態複雜性和垃圾處理機制使用的多少而各有不同。如果 JVM 的實現比較優化的話，那麼這些功能甚至可以增加記憶體分配的效能。這和總是使用 STL 或者代管 C++ 的程式的情況類似。

儘管如此，仍然有許多人認為 Java 的效能低。這部分歸因於昇陽電腦最初的 JVM 實現使用未優化的解釋機制來執行位元組碼。一些新版本的 JVM 使用 Just-In-Time（JIT）編譯器，在載入位元組碼的時候將其編譯成針對運行環境的本地代碼來實現一些本地編譯器的優化特性。Just-In-Time 機制和本地編譯的效能比較仍舊是一個有爭議的話題。JIT 編譯需要很多時間，對於運行時間不長或者代碼很多的大型程式並不適宜。但是不算 JIT 編譯階段的話，程式的運行效能在很多 JVM 下可以和本地編譯的程式一爭短長，甚至在一些計算比較密集的數值計算領域也是這樣。目前，Java 已經使用更先進的 HotSpot 技術來代替 JIT 技術，Java 的效能有了更進一步的提升。另外，在使用 - server 選項運行 Java 程式時，也可以對 Java 進行更深入的優化，比如在運行時將調用較多的方法內聯（inline）到程式中來提高運行速度，這就是所謂的「動態優化」，而本地編譯器是無法做到這一點的；這也是一些 Java 代碼比對應用 C/C++ 等語言編寫的本地代碼運行的更快的原因之一。微軟的.NET 平臺也使用 JIT 編譯器，所以也有類似問題。

Java 的設計目的主要是安全性和可攜性，所以對於一些特性，比如對硬體架構和記憶體位址存取的直接存取都被去除了。如果需要間接調用這些底層功能的話，就需要使用 JNI（Java 本地介面）來調用本地代碼，而間接存取意味著頻繁調用這些特性時效能損失會很大，微軟的.NET 平臺也有這樣的問題。所以到目前為止，效能敏感的代碼，例如驅動程式和 3D 電子遊戲，還是大多使用本地編譯，甚至直接以不直接支援物件導向的 C 語言或機器碼編寫。但最近已經有了許多用純 Java 編寫的 3D 遊戲，其效果與用 C 語言編寫的不相上下，例如「合金戰士」（英文名：Chrome）。這主要是因為新版的 Java 3D 技術已經能像 C++ 一樣調用硬體加速，也就是使用顯示卡來加速，無論是 C++ 還是 Java 語言寫的 3D 遊戲都是使用顯示卡及 GPU 來處理，從而使得 CPU 可以專注於其他方面的工作。

## 用途

**桌面 GUI 應用程式：**

Java 通過抽象窗口工具包（AWT），Swing 和 JavaFX 等多種方式提供 GUI 開發。雖然 AWT 包含許多預先構建的組件，如選單，按鈕，列表以及眾多第三方組件，但 Swing（一個 GUI 小部件工具包）還提供某些進階組件，如樹，表格，捲動窗格，索引標籤式面板和列表。JavaFX 是一組圖形和媒體包，提供了 Swing 互操作性，3D 圖形功能和自包含的部署模型，可以快速編寫 Java 小應用程式和應用程式的指令碼。

**行動應用程式：**

Java Platform，Micro Edition（Java ME 或 J2ME）是一個跨平台框架，用於構建可在所有 Java 支援的裝置（包括功能型手機和智慧型手機）上執行的應用程式。此外，最受歡迎的行動作業系統之一的 Android 應用程式通常使用 Android 軟體開發套件（SDK）或其他環境在 Java 中編寫指令碼。

**嵌入式系統：**

從微型晶片到專用電腦的嵌入式系統是執行專門任務的大型電腦電系統的組件。諸如 SIM 卡，藍光光碟播放器，公用事業儀表和電視機等多種裝置都使用嵌入式 Java 技術。據甲骨文公司稱，100％的藍光光碟播放器和 1.25 億台電視裝置都採用 Java 技術。

**Web 應用程式：**

Java 通過 Servlets，Struts 或 JSP 提供對 Web 應用程式的支援。程式語言提供的簡單程式設計和更高的安全性使得大量政府應用程式可用於基於 Java 的健康，社會安全，教育和保險。Java 也可以使用 Broadleaf 等開源電子商務平台開發電子商務 Web 應用程式。

**分散式系統：**

Java 更多時候用於構建大型分散式應用，基於 java 的分散式生態非常豐富，各種成熟的基礎組件幫助 java 開發者迅速搭建起分散式系統。比較著名的分散式框架有: spring cloud, dubbo, zookeeper

**Web 伺服器和應用程式伺服器：**

今天的 Java 生態系統包含多個 Java Web 伺服器和應用程式伺服器。雖然 Apache Tomcat，Simple，Jo !, Rimfaxe Web 伺服器（RWS）和 Project Jigsaw 占據了 Web 伺服器空間，但 WebLogic，WebSphere 和 Jboss EAP 在商業應用伺服器領域占據重要地位。

**企業應用程式：**

Java 企業版（Java EE）是一種流行的平台，為指令碼和執行企業軟體（包括網路應用程式和 Web 服務）提供 API 和執行時環境。甲骨文宣稱 Java 可以在 97％的企業電腦上執行。Java 憑藉更高的效能保證和更快的計算能力使得像 Murex 這樣的高頻交易系統可以被編入指令碼中。同時它也是各種銀行應用程式的中樞，它們將 Java 從前端使用者端執行到後端伺服器端。

**科學應用：**

Java 是許多軟體開發人員用於編寫涉及科學計算和數學運算的應用程式的選擇之一。這些程式通常被認為是快速和安全的，具有更高的可攜式性和低維護性。像 MATLAB 這樣的應用程式使用 Java 來作為互動使用者介面和作為核心系統的一部分。

## 參見

## 註釋

## 參考文獻

### 參照

### 來源

## 外部連結

Java 官方網站 （頁面存檔備份，存於網際網路檔案館）