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

<image>

<image>

语言最开始只是太阳微系统（Sun MicroSystems）公司在1990年12月开始研究的一个内部项目。太阳微系统公司的一个叫做帕特里克·诺顿的工程师被公司自己开发的C++和C语言编译器搞得焦头烂额，因为其中的API极其难用。帕特里克决定改用NeXT，同时他也获得了研究公司的一个叫做“Stealth计划”的项目的机会。

“Stealth计划”后来改名为“Green计划”，詹姆斯·高斯林和麦克·舍林丹（Mike Sheridan）也加入了帕特里克的工作小组。他们和其他几个工程师一起在加利福尼亚州门罗帕克市沙丘路的一个小工作室里面研究开发新技术，瞄准下一代智能家电（如微波炉）的程序设计，太阳微系统预料未来科技将在家用电器领域大显身手。团队最初考虑使用C++语言，但是很多成员包括太阳微系统的首席科学家比尔·乔伊，发现C++和可用的API在某些方面存在很大问题。

工作小组使用的是嵌入式系统，可以用的资源极其有限。很多成员发现C++太复杂以至很多开发者经常错误使用。他们发现C++缺少垃圾回收系统，还有可移植的安全性、分布程序设计、和多执行绪功能。最后，他们想要一种易于移植到各种设备上的平台。

根据可用的资金，乔伊决定开发一种集C语言和Mesa语言大成的新语言，在一份报告上，乔伊把它叫做“未来”，他提议太阳微系统的工程师应该在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和互联网

<image>

<image>

<image>

<image>

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 (LTS)
- 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 (LTS)
- 2022年3月，Oracle公司发布Java SE 18
- 2022年9月，Oracle公司发布Java SE 19
- 2023年3月，Oracle公司发布Java SE 20
- 2023年9月，Oracle公司发布Java SE 21 (LTS)
- 2024年3月, Oracle公司发布Java SE 22
- 2024年9月, Oracle公司发布Java SE 23
- 2025年3月, Oracle公司发布Java SE 24
- 2025年9月, Oracle公司发布Java SE 25 (LTS)

## 语言特性

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关键字。这些关键字不能用于常量、变量、和任何标识符的名称。

类别｜关键字｜说明

访问控制｜private｜私有的

protected｜受保护的

public｜公共的

类、方法和变量修饰符｜abstract｜声明抽象

class｜类

extends｜扩充,继承

final｜最终值,不可改变的

implements｜实现（接口）

interface｜接口

native｜本地，原生方法（非Java实现）

new｜新,创建

static｜静态

strictfp｜严格,精准

synchronized｜线程,同步

transient｜短暂

volatile｜易失

程序控制语句｜break｜跳出循环

case｜定义一个值以供switch选择

continue｜继续

default｜默认

do｜运行

else｜否则

for｜循环

if｜如果

instanceof｜实例

return｜返回

switch｜根据值选择执行

while｜循环

错误处理｜assert｜断言表达式是否为真

catch｜捕捉异常

finally｜有没有异常都执行

throw｜抛出一个异常对象

throws｜声明一个异常可能被抛出

try｜捕获异常

包相关｜import｜引入

package｜包

基本类型｜boolean｜布尔型

byte｜字节型

char｜字符型

double｜双精度浮点

float｜单精度浮点

int｜整型

long｜长整型

short｜短整型

null｜空

变量引用｜super｜父类,超类

this｜本类

void｜无返回值

保留关键字｜goto｜是关键字，但不能使用

const｜是关键字，但不能使用

注释

注释的作用：标识程序是干什么的，以及它是如何构建的。注释帮助程序员进行相互沟通以及理解程序。注释不是程序设计语言，所以编译器编译程序时忽略它们。

### 接口和类别

Java自带了创建接口的类别，可以这样使用：

```java
public interface Deleteable {
    void delete();
}
```

这段代码的意思是任何实现（implement）`Deleteable`接口的类别都必须实现`delete()`方法。每个类别对这个方法的实现可以自行定制。由此概念可以引出很多种使用方法，下面是一个类别的例子：

```java
public class Fred implements Deleteable {
    // 必須實作Deleteable介面中的delete方法
    @Override 
    public void delete() { 
        // 實作的程式碼
    }
        
    // 這個類別也可以包含其他方法 
    public void doOtherStuff() {

    }
}
```

在另外一个类别中，可以使用这样的代码：

```java
public void deleteAll（Deleteable [] list）{
    for（int i = 0; i < list.length; i++）{
        list[i].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
class HelloWorld {
    public static void main(String[] args) {
        System.out.println("hello, world!");
    }
}
```

## 关于Java的批评

<image>

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来作为交互用户界面和作为核心系统的一部分。

## 基本资料

- 编程范型：多重范型：面向对象（类别基础）、结构化、指令式、泛型、反射、并发计算
- 发行时间：1995年
- 设计者：詹姆斯·高斯林、太阳计算机系统
- 开发者：甲骨文公司 (太阳计算机系统)
- 类型系统：静态、安全、强类型、标明类型系统
- 软件实现：OpenJDK、GCJ。
- dialects：泛型Java、Pizza (编程语言)
- 许可证：GNU通用公共许可协议、JCP
- 文件扩展名：.java、.class、.jar