Java是一种广泛使用的计算机编程语言,拥有跨平台、面向对象、泛型编程的特性,广泛应用于企业级Web应用开发和流动应用开发。
编程范型 | 多重范型:面向对象(类别基础)、结构化、指令式、泛型、反射、并发计算 |
---|---|
设计者 | 詹姆斯·高斯林 太阳计算机系统 |
实现者 | 甲骨文公司 (太阳计算机系统) |
发行时间 | 1995年[1] |
当前版本 |
|
类型系统 | 静态、安全、强类型、标明类型 |
许可证 | GNU通用公共许可协议、JCP |
文件扩展名 | .java、.class、.jar |
网站 | www |
主要实现产品 | |
OpenJDK、GCJ、其他 | |
派生副语言 | |
泛型Java、Pizza | |
启发语言 | |
Ada 83、 Generic Java、 | |
影响语言 | |
Ada 2005、 | |
任职于Sun微系统的詹姆斯·高斯林等人于1990年代初开发Java语言的雏形,最初被命名为Oak,目标设置在家用电器等小型系统的编程语言,应用在电视机、电话、闹钟、烤面包机等家用电器的控制和通讯。由于这些智能化家电的市场需求没有预期的高,Sun微系统放弃了该项计划。随着1990年代互联网的发展,Sun微系统看见Oak在互联网上应用的前景,于是改造了Oak,于1995年5月以Java的名称正式发布。Java伴随着互联网的迅猛发展而发展,逐渐成为重要的网络编程语言。
Java编程语言的风格十分接近C++语言。继承了C++语言面向对象技术的核心,舍弃了容易引起错误的指针,以引用取代;移除了C++中的运算符重载和多重继承特性,用接口取代;增加垃圾回收器功能。在Java SE 1.5版本中引入了泛型编程、类型安全的枚举、不定长参数和自动装/拆箱特性。Sun微系统对Java语言的解释是:“Java编程语言是个简单、面向对象、分布式、解释性、健壮、安全、与系统无关、可移植、高性能、多线程和动态的语言”。
Java不同于一般的编译语言或解释型语言。它首先将原始码编译成字节码,再依赖各种不同平台上的虚拟机来解释执行字节码,从而具有“一次编写,到处运行”的跨平台特性。在早期JVM中,这在一定程度上降低了Java程序的运行效率。但在J2SE1.4.2发布后,Java的执行速度有了大幅提升。
与传统类型不同,Sun微系统在推出Java时就将其作为开放的技术。全球的Java开发公司被要求所设计的Java软件必须兼容。“Java语言靠群体的力量而非公司的力量”是Sun微系统的口号之一,并获得了广大软件开发商的认同。这与微软公司所倡导的注重精英和封闭式的模式完全不同,此外,微软公司后来推出了与之竞争的.NET平台以及模仿Java的C#语言。后来Sun微系统被甲骨文公司并购[13],Java也随之成为甲骨文公司的产品。
历史
语言最开始只是Sun微系统(Sun MicroSystems)公司在1990年12月开始研究的一个内部项目。Sun微系统公司的一个叫做帕特里克·诺顿的工程师被公司自己开发的C++和C语言编译器搞得焦头烂额,因为其中的API极其难用。帕特里克决定改用NeXT,同时他也获得了研究公司的一个叫做“Stealth计划”的项目的机会。
“Stealth计划”后来改名为“Green计划”,詹姆斯·高斯林和麦克·舍林丹(Mike Sheridan)也加入了帕特里克的工作小组。他们和其他几个工程师一起在加利福尼亚州门罗帕克市沙丘路的一个小工作室里面研究开发新技术,瞄准下一代智慧家电(如微波炉)的程式设计,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微系统。
由于商标搜索显示Oak已被一家显卡制造商注册。于是同年,Oak被改名为Java。当使用十六进制编辑器打开由Java原始码编译出的二进制文件(.class文件)的话,最前面的32位将显示为CA FE BA BE,即词组“CAFE BABE”(咖啡屋宝贝)。
1994年6月,在同约翰·盖吉、詹姆斯·高斯林、比尔·乔伊、帕特里克·诺顿、韦恩·罗斯因和埃里克·施密特经历了一场历时三天的头脑风暴后,团队决定再一次改变努力的目标,这次他们决定将该技术应用于万维网。他们认为随着Mosaic浏览器的到来,因特网正在向同样的高度互动的远景演变,而这一远景正是他们在有线电视网中看到的。作为原型,帕特里克·诺顿写了一个小型万维网浏览器,WebRunner,后来改名为HotJava[14]。
1994年10月,HotJava和Java平台为公司高层进行演示。1994年,Java 1.0a版本已经可以提供下载,但是Java和HotJava浏览器的第一次公开发布却是在1995年3月23日SunWorld大会上进行的。Sun微系统的科学指导约翰·盖吉宣告Java技术。这个发布是与网景公司的执行副总裁马克·安德森的惊人发布一起进行的,宣布网景将在其浏览器中包含对Java的支持。1996年1月,Sun微系统成立了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提供以下三个版本:
2006年Sun微系统在JavaOne公布Java 开放原始码项目,并推出OpenJDK计划[15]。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月,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[16]
- 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
- 2023年3月,Oracle公司发布Java SE 20
- 2023年9月,Oracle公司发布Java SE 21
语言特性
Java之所以被开发,是要达到以下五个目的:
- 应当使用面向对象程式设计方法学
- 应当允许同一程序在不同的计算机平台执行
- 应当包括内建的对计算机网络的支持
- 应当被设计成安全地执行远端代码
- 应当易于使用,并借鉴以前那些面向对象语言(如C++)的长处。
Java技术主要分成几个部分:Java语言、Java执行环境、类库。一般情况下说Java时并不区分指的是哪个部分。
Java在1.5版本时,做了重大改变,Sun微系统并1.5版本重命名为Java 5.0。
Java的特点之一就是面向对象,是程式设计方法的一种。“面向对象程式设计语言”的核心之一就是开发者在设计软件的时候可以使用自定义的类型和关联操作。代码和数据的实际集合体叫做“对象”。一个对象可以想象成绑定了很多“行为(代码)”和“状态(数据)”的物体。对于数据结构的改变需要和代码进行通信然后操作,反之亦然。面向对象设计让大型软件工程的计划和设计变得更容易管理,能增强工程的健康度,减少失败工程的数量。
跨平台性是Java主要的特性之一,跨平台使得用Java语言编写的程序可以在编译后不用经过任何更改,就能在任何硬件装置条件下运行。这个特性经常被称为“一次编译,到处运行”。
执行Java应用程式必须安装Java 运行时环境(Java Runtime Environment,JRE),JRE包括Java虚拟机(Java Virtual Machine,JVM),以及Java平台核心类和基础Java 平台库。[17]通过JVM才能在电脑系统执行Java应用程式(Java Application),这与.Net Framework的情况一样,所以电脑上没有安装JVM,那么这些java程序将不能够执行。
实现跨平台性的方法是大多数编译器在进行Java语言程序的编码时候会生成一个用字节码写成的“半成品”,这个“半成品”会在Java虚拟机(解释层)的帮助下运行,虚拟机会把它转换成当前所处硬件平台的原始代码。之后,Java虚拟机会打开标准库,进行数据(图片、线程和网络)的存取工作。主要注意的是,尽管已经存在一个进行代码翻译的解释层,有些时候Java的字节码代码还是会被JIT编译器进行二次编译。
有些编译器,比如GCJ,可以自动生成原始代码而不需要解释层。但是这些编译器所生成的代码只能应用于特定平台。并且GCJ目前只支持部分的Java API。
甲骨文公司对于Java的许可是“全兼容的”,这也导致了微软和Sun微系统关于微软的程序不支持RMI和JNI接口、并且增加特性为己所用的法律争端。Sun微系统最终赢得了官司,获得了大约两千万美元的赔偿,法院强制要求微软执行Sun微系统关于Java的许可要求。作为回应,微软不再在Windows系统中捆绑Java,最新的Windows版本,Windows Vista和Internet Explorer 7.0版本也不再提供对于Java应用程式和控件的支持。但是Sun微系统和其他使用Java运行时系统的公司在Windows操作系统下对用户提供无偿的第三方插件和程序支持。
Java语言在最开始应用的时候是没有解释层的,所有需要编译的代码都直接转换成机器的原始代码。这样做虽然使程序获得了最佳的性能,但是导致程序异常臃肿。从JIT技术开始,Java的程序都经过一次转换之后才变成机器码。很多老牌的第三方虚拟机都使用一种叫做“动态编译”的技术,也就是说虚拟机实时监测和分析程序的运行行为,同时选择性地对程序所需要的部分进行编译和优化。所有这些技术都改善了代码的运行速度,但是又不会让程序的体积变得失常。
程序的轻便性事实上是软件编写很难达到的一个目标,Java虽然成功地实现了“一次编译,到处运行”,但是由于平台和平台之间的差异,所编写的程序在转换代码的时候难免会出现微小的、不可察觉的错误和意外。有些程序员对此非常头疼,他们嘲笑Java的程序不是“一次编译,到处运行”,而是“一次编译,到处调试”。以Java AWT为例,早期Java AWT内提供的按钮、文字区等均是以计算机系统所默认的样式而显示。这令Java程序在有些没有提供图案的计算机系统产生错误(在Microsoft Windows设有窗口管理器,在一些Linux distribution则没有)。后来Sun微系统针对Java AWT一些问题而推出Java Swing。
平台无关性让Java在伺服器端软件领域非常成功。很多伺服器端软件都使用Java或相关技术建立。
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++存储器处理快数倍的技术文章[18],而著名的Java技术书籍《Java编程思想》(Thinking in Java)也有一段论述Java存储器及性能达到甚至超过C++的章节[19]。
编写Java程序前应注意以下几点:
- 大小写敏感:Java是大小写敏感的,这就意味着标识符
Hello
与hello
是不同的。 - 类名:对于所有的类来说,类名的首字母应该大写。如果类名由若干单词组成,那么每个单词的首字母应该大写,例如
MyFirstJavaClass
。 - 方法名:所有的方法名都应该以小写字母开头。如果方法名含有若干单词,则后面的每个单词首字母大写,例如
myFirstJavaMethod
。 - 源文件名:源文件名必须和文件内名字唯一且公开(由public 关键词修饰)的类名相同。当保存文件的时候,你应该使用该类名作为文件名保存(切记Java是大小写敏感的),文件名的后缀为
.java
。(如果文件名和类名不相同则会导致编译错误)。 - 主方法入口:所有的Java程序由
public static void main(String[] args)
方法开始执行。
下面列出了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自带了创建接口的类别,可以这样使用:
public interface Deleteable {
void delete();
}
这段代码的意思是任何实现(implement)Deleteable
接口的类别都必须实现delete()
方法。每个类别对这个方法的实现可以自行定制。由此概念可以引出很多种使用方法,下面是一个类别的例子:
public class Fred implements Deleteable {
// 必須實作Deleteable介面中的delete方法
@Override
public void delete() {
// 實作的程式碼
}
// 這個類別也可以包含其他方法
public void doOtherStuff() {
}
}
在另外一个类别中,可以使用这样的代码:
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的设定由Sun微系统和其他公司通过JCP(Java社群程序)决定。任何公司和个人都可以参与这个工程,对API进行设计。2004年,IBM和BEA公司准备联合对官方的Java开源软件工程进行支持,但是2005年初,Sun微系统拒绝了这个支持。
Hello World
下面这个程序显示“Hello world!”然后结束运行,注意java.lang
包是自动加载的,所以不需要在程序之前加入import java.lang.*;
class HelloWorld {
public static void main(String[] args) {
System.out.println("hello, world!");
}
}
关于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版本时候引入了正则表达式。
使用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版本的十倍左右。[21]而即使是在同一时期,不同公司的JDK和JRE的性能也不一样,比如Sun微系统、IBM、BEA等公司都有自己开发的JDK和JRE。
Java语言的一些特性不可避免的有额外的性能代价,例如数组范围检查、运行时类型检查等等。Java程序的性能还会因为不同的动态复杂性和垃圾处理机制使用的多少而各有不同。如果JVM的实现比较优化的话,那么这些功能甚至可以增加存储器分配的性能。这和总是使用STL或者托管C++的程序的情况类似。
尽管如此,仍然有许多人认为Java的性能低。这部分归因于Sun微系统最初的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小应用程式和应用程式的脚本。[22]
- 流动应用程序:
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在商业应用伺服器领域占据重要地位[23]。
- 企业应用程式:
Java企业版(Java EE)是一种流行的平台,为脚本和运行企业软件(包括网络应用程式和Web服务)提供API和运行时环境。甲骨文宣称Java可以在97%的企业计算机上运行。Java凭借更高的性能保证和更快的计算能力使得像Murex这样的高频交易系统可以被编入脚本中。同时它也是各种银行应用程式的中枢,它们将Java从前端用户端运行到后端伺服器端。
- 科学应用:
Java是许多软件开发人员用于编写涉及科学计算和数学运算的应用程式的选择之一。这些程序通常被认为是快速和安全的,具有更高的便携性和低维护性。像MATLAB这样的应用程式使用Java来作为交互用户界面和作为核心系统的一部分。
参见
注释
参考文献
外部链接
Wikiwand in your browser!
Seamless Wikipedia browsing. On steroids.
Every time you click a link to Wikipedia, Wiktionary or Wikiquote in your browser's search results, it will show the modern Wikiwand interface.
Wikiwand extension is a five stars, simple, with minimum permission required to keep your browsing private, safe and transparent.