Java

维基百科,自由的百科全书

(重定向自Java语言)
跳转到: 导航, 搜索
Java
编程范型: Object-oriented, structured, imperative
面市時間: 1990年代
設計者: 昇陽電腦
型態系統: Static, strong, safe, nominative
主要實作產品: Numerous
啟發語言: Objective-C, C++, Smalltalk, Eiffel, C#[1]
影響語言: C#, D, J#, PHP, Ada 2005
作業系統: 跨平台
網站: http://www.java.com/

Java,是一种可以撰寫跨平台应用软件面向对象程序设计语言,由升阳(Sun Microsystems)公司的詹姆斯·高斯林(James Gosling)等人于1990年代初开发。它最初被命名为Oak,目標設定在家用电器等小型系統的编程语言,來解决诸如电视机电话闹钟烤面包机等家用电器的控制和通讯问题。由于这些智能化家电的市场需求没有预期的高,Sun放弃了该项计划。就在Oak几近失敗之时,随着互聯網的发展,Sun看到了Oak在计算机网络上的广阔应用前景,于是改造了Oak,在1995年5月以“Java”的名称正式发布了。Java伴随着互联网的迅猛发展而发展,逐渐成为重要的网络编程语言。

Java 编程语言的风格十分接近C++语言。继承了 C++ 语言面向对象技术的核心,Java舍弃了C++语言中容易引起错误的指针(以引用取代)、运算符重载(operator overloading)、多重继承(以接口取代)等特性,增加了垃圾回收器功能用于回收不再被引用的对象所占据的内存空间。在 Java SE 1.5 版本中Java又引入了泛型编程(Generic Programming)、类型安全的枚举、不定长参数和自动装/拆箱等语言特性。

Java不同於一般的编译執行计算机语言和解释执行计算机语言。它首先将源代码编译成字节码(bytecode),然后依赖各种不同平台上的虚拟机来解释执行字节码,从而实现了“一次编译、到处执行”的跨平台特性。不过,这同时也在一定程度上降低了 Java 程序的运行效率。但在J2SE1.4.2发布后,Java的執行速度有了大幅提升。

与传统程序不同,Sun 公司在推出 Java 之际就将其作为一种开放的技术。全球数以万计的 Java 开发公司被要求所设计的 Java 软件必须相互兼容。“Java 语言靠群体的力量而非公司的力量”是 Sun 公司的口号之一,并获得了广大软件开发商的认同。这与微软公司所倡导的注重精英和封闭式的模式完全不同。

Sun公司对Java编程语言的解释是:Java编程语言是个简单、面向对象、分布式、解释性、健壮、安全与系统无关、可移植、高性能、多线程和动态的语言。

Java平台是基于Java语言的平台。这样的平台目前非常流行,因此微软公司推出了与之竞争的.NET平台以及模仿Java的C#语言。

目录

[编辑] 历史

[编辑] 早期的Java

Oak语言的吉祥物,Duke
Oak语言的吉祥物,Duke

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

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

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

根据可用的资金,比尔·乔伊决定开发一种集C语言和Mesa语言大成的新语言,在一份报告上,乔伊把它叫做“未来”,他提议升阳公司的工程师应该在C++的基础上,开发一种面向对象的环境。最初,高斯林试图修改和扩展C++的功能,他自己称这种新语言为 C++ ++ --,但是后来他放弃了。他将要创造出一种全新的语言,被他命名为“Oak”(橡树),以他的办公室外的树而命名。

就像很多开发新技术的秘密的工程一样,工作小组没日没夜地工作到了1992年的夏天,他们能够演示新平台的一部分了,包括Green操作系统,Oak的程序设计语言,类库,和其硬件。最初的尝试是面向一种类PDA设备,被命名为Star7,这种设备有鲜艳的图形界面和被称为“Duke”的智能代理来帮助用户。1992年12月3日,这台设备进行了展示。

同年11月,Green计划被转化成了“FirstPerson有限公司”,一个升阳公司的全资子公司,团队也被重新安排到了帕洛阿尔托。FirstPerson团队对建造一种高度互动的设备感兴趣,当时代华纳发布了一个关于电视机顶盒的征求提议书时(Request for proposal),FirstPerson改变了他们的目标,作为对征求意见书的响应, 提出了一个机顶盒平台的提议。但是有线电视业界觉得FirstPerson的平台给予用户过多地控制权,因此FirstPerson的投标败给了SGI。与3DO 公司的另外一笔关于机顶盒的交易也没有成功,由于他们的平台不能在电视工业产生任何效益,公司再并回升阳公司。

[编辑] Java和互联网

1994年6月7月间,在经历了一场历时三天的脑力激盪的讨论后,约翰·盖吉詹姆斯·高斯林比尔·乔伊帕特里克·诺顿韦恩·罗斯因埃里克·斯库米,团队决定再一次改变了努力的目标,这次他们决定将该技术应用于万维网。他们认为随着Mosaic浏览器的到来,因特网正在向同样的高度互动的远景演变,而这一远景正是他们在有线电视网中看到的。作为原型,帕特里克·诺顿写了一个小型万维网浏览器,WebRunner,后来改名为HotJava

[编辑] Java和「Java」

同年,Oak改名为Java商标搜索显示,Oak已被一家显卡制造商注册,因此团队找到了一个新名字。这个名字是在很多成员常去的本地咖啡馆中杜撰出来的。名字是不是首字母缩写还不清楚,很大程度上来说不是。虽然有人声称是开发人员名字的组合:James Gosling(詹姆斯·高斯林)+Arthur Van Hoff(阿瑟·凡·霍夫)+Andy Bechtolsheim(安迪·贝克托克姆),或“Just Another Vague Acronym”(只是另外一个含糊的缩写)。还有一种比较可信的说法是这个名字是出于对咖啡的喜爱,所以以Java咖啡来命名。类文件的前四个字节如果用十六进制阅读的话,分别为CA FE BA BE, 就会拼出两个单词“CAFE BABE”(咖啡宝贝)。

[编辑] Java和浏览器

1994年10月HotJava和Java平台为公司高层进行演示。1994年,Java 1.0a版本已经可以提供下載,但是Java和HotJava浏览器的第一次公开发布却是在1995年3月23日SunWorld大会上进行的。升阳公司的科学指导约翰·盖吉宣告Java技术。这个发布是与网景公司的执行副总裁马克·安德森的惊人发布一起进行的,宣布网景将在其浏览器中包含对Java的支持。1996年1月,升阳公司成立了Java业务集团,专门开发Java技术。

[编辑] Java近况

在流行几年之后,Java在浏览器中的地位被逐步侵蚀。它在简单交互性动画方面的用途已经完全被Adobe公司的Flash排挤,2005年Java倾向只被用于雅虎游戏那样的更为复杂的应用程序。Java同时遭受到来自微软的反对,他们决定在新版本的Internet ExplorerWindows中不再附带Java平台。

与此相反。在万维网的服务器端和手持设备上,Java变得更加流行。很多网站在前端使用JSP和其他的Java技术。

在桌面系统上,独立的Java程序还是相对少见,这是因为Java平台的运行开销较大,而许多人的电脑上没有安装Java,由于网络带宽在以前较小,下载Java曾经是个耗时的事情。但是随着计算机计算能力、网络带宽在10年中取得了很大的进步,同时虚拟机和编译器的质量得到了提高,许多应用程序得到了广泛的使用,包括:

开源软件:

闭源软件:

还有许多用Java写的软件,可以在 http://www.java.com 找到。 在以下网页可以看到非常多用Java写的程序: http://java.sun.com/products/ 下面有大量用Java Swing开发的桌面Java程序 http://java.sun.com/products/jfc/tsc/sightings/ 目前Java提供以下三个版本:

以上为Java各种版本的SUN公司官方中文翻译方式:http://cn.sun.com/press/jun2005/20050627-6.html

[编辑] 版本历史(时间表)

从Java 2开始出现的,Java互联网启动中心
从Java 2开始出现的,Java互联网启动中心

[编辑] 语言特性

Java之所以被开发,是要达到以下五个目的:

  • 应当使用面向对象程序设计方法学
  • 应当允许同一程序在不同的计算机平台执行
  • 应当包括内建的对计算机网络的支持
  • 应当被设计成安全地执行远端代码
  • 应当易于使用,并借鉴以前那些面向对象语言(如C++)的长处。

Java技术主要分成几个部分:Java语言、运行环境JVM、类库。一般情况下说Java时并不区分指的是哪个部分。

[编辑] 面向对象

Java的特点之一就是面向对象,是程序设计方法的一种。“面向对象程序设计语言”的核心之一就是开发者在设计软件的时候可以使用自定义的类型和关联操作。代码和数据的实际集合体叫做“对象”。一个对象可以想象成绑定了很多“行为(代码)”和“状态(数据)”的物体。对于数据结构的改变需要和代码进行通信然后操作,反之亦然。面向对象设计让大型软件工程的计划和设计变得更容易管理,能增强工程的健康度,减少失败工程的数量。

面向对象设计另外一个目标就是能产生很多的有关联的类,可以让软件的再开发变得简单。举例来说,很多软件工程都有同样的功能,尤其是很多应用了同一原理组织的软件工程。软件的二次开发者想自己为软件开发插件以增强功能的时候,绝对不想看到混乱的开发代码和管理计划。面向对象的目的就是不生產难懂且难以使用的代码,为软件各个功能群之间建立有效的通信通道。很多开源软件社区正在计划给软件作者提供更多的类来让软件的二次开发变得简便。

[编辑] 跨平台性

一个Java软件的界面,在所有系统下面都可以运行这个程序
一个Java软件的界面,在所有系统下面都可以运行这个程序

Java语言的第二个特性就是跨平臺性,也就是说使用Java语言编写的程序可以在编译后不用经过任何更改,就能在任何硬件设备条件下运行。这个特性经常被称为“一次编译,到处运行”。

实现跨平台性的方法是大多数编译器在进行Java语言程序的编码时候会生成一个用字节码Bytecode)写成的“半成品”,这个“半成品”会在Java虚拟机(解释层)的帮助下运行,虚拟机会把它转换成当前所处硬件平台的原始代码。之后,Java虚拟机会打开标准库,进行数据(图片、线程和网络)的存取工作。主要注意的是,尽管已经存在一个进行代码翻译的解释层,有些时候Java的字节码代码还是会被JIT编译器进行二次编译。

有些编译器,比如GCJ,可以自动生成原始代码而不需要解释层。但是这些编译器所生成的代码只能应用于特定平台。并且GCJ目前只支持部分的Java API。

升阳对于Java的许可是“全兼容的”,这也导致了微软和升阳关于微软的程序不支持RMI和JNI接口、并且增加特性为己所用的法律争端。升阳最终赢得了官司,获得了大约两千万美元的赔偿,法院强制要求微软执行升阳公司关于Java的许可要求。作为回应,微软不再在Windows系统中捆绑Java,最新的Windows版本,Windows Vista和Internet Explorer 7.0版本也不再提供对于Java应用程序和控件的支持。但是升阳公司和其他使用Java运行时系统的公司对于微软的操作对用户提供无偿的第三方插件和程序支持。

Java语言使用解释层最初是为了轻巧性。所以这些程序的运行效率比C语言和C++要低很多,用户也对此颇有微词。很多最近的调查显示Java的程序运行速度比几年前要高出许多,有些同样功能的程序的效率甚至超过了C++和C语言编写的程序。

Java语言在最开始应用的时候是没有解释层的,所有需要编译的代码都直接转换成机器的原始代码。这样做的后果就是获得了最佳的性能,但是程序臃肿异常。从JIT技术开始,Java的程序都经过一次转换之后才变成机器码。很多老牌的第三方虚拟机都使用一种叫做“动态编译”的技术,也就是说虚拟机实时监测和分析程序的运行行为,同时选择性地对程序所需要的部分进行编译和优化。所有这些技术都改善了代码的运行速度,但是又不会让程序的体积变得失常。

程序的轻便性事实上是软件编写很难达到的一个目标,Java虽然成功地实现了“一次编译,到处运行”,但是由于平台和平台之间的差异,所编写的程序在转换代码的时候难免会出现微小的、不可察觉的错误和意外。有些程序员对此非常头疼,他们嘲笑Java的程序不是“一次编译,到处运行”,而是“一次编译,到处调试”。

平台无关性让Java在服务器端软件领域非常成功。很多服务器端软件都使用Java或相关技术建立。

[编辑] 自动垃圾回收(Garbage Collection)

C++语言被用户诟病的原因之一就是大多数C++编译器不支持垃圾收集机制。通常使用C++编程的时候,程式設計師於程式中起始物件時,會在主機記憶體堆疊上分配一塊記憶體與位址,當不需要此物件時,進行解構或者删除的时候再释放分配的記憶體位址。如果对象是在堆疊上分配的,而程序员又忘记进行删除,那么就会造成記憶體流失(Memory Leak)。长此以往,程序运行的时候可能会生成很多不清除的垃圾,浪费了不必要的記憶體空间。更糟糕的是,如果同一内存地址被删除两次的话,程序会变得不稳定,甚至崩溃。因此有经验的C++程序员都会在删除之后将指针重置为0,然后在删除之前先判断指针是否为0。

Java语言则不同,上述的情况被自动垃圾收集功能自动处理。对象的建立和放置都是在記憶體堆疊(STACK)上面进行的。程序或者其他的对象可以锁定一块堆疊地址来进行其他对象的引用。当一个对象没有任何引用的时候,Java的自动垃圾收集机制就发挥作用,自动删除这个对象所占用的空间,释放内存以避免内存泄漏。但是内存泄漏并不是就此避免了,当程序员疏忽大意地忘记解除一个对象不应该有的引用的时候,内存泄漏仍然不可避免,不过发生的几率要比不启用垃圾收集机制的C++程序少很多。但是总体来讲,自动垃圾收集机制要安全和简单许多。

不同厂商、不同版本的JVM中的内存垃圾回收机制并不完全一样,通常越新版本的内存回收机制越快,IBM、BEA、SUN等等开发JVM的公司都曾宣称过自己制造出了世界上最快的JVM, JVM性能的世界纪录也在不断的被打破并提高。

IBM有一篇有关Java内存回收机制比不启用垃圾收集机制的C++内存处理快数倍的技术文章,可在如下网址找到:
http://www-128.ibm.com/developerworks/cn/java/j-jtp09275.html
而著名的Java技术书籍《Java编程思想》(《Thinking in Java》)也有一段论述Java内存及性能达到甚至超过C++的章节:
http://www.sdau.edu.cn/support/thinkinjava/chapter/appe.htm

但是应该注意到,C++中也可以使用“智能指针”(Smart Pointer)或者使用C++托管扩展编译器的方法来实现自动化内存释放,智能指针可以在标准类库中找到,而C++托管扩展被微软的Visual C++ 7.0及以上版本所支持。智能指针的优点是不需引入缓慢的垃圾收集机制,而且可以不考虑线程安全的问题,但是缺点是如果不善使用智能指针的话,性能有可能不如垃圾收集机制,而且不断地分配和释放内存可能造成内存碎片,需要手动对堆进行压缩。除此之外,由于智能指针是一个基于模板的功能,所以没有经验的程序员在需要使用多态特性进行自动清理时也可能束手无策。

當然,作為一個「負責任」的程式編撰員,在程式完結前应该手動清理不再需要的變數和物件,令效能有點提升。以Java为例,finalize方法位於 Java.Object 內,而Object 這個类是每一個类自動承繼的。因此清理需要的便是覆寫finalize便行了

protected void finalize() throws Throwable{
    super.finalize();
}

當中若有任何變數要清理,可以在super.finalize() 前加上 <變數> = null; 或 <所屬的Class>.<變數> = null;

不過事實上,就算使用了 finalize(),你還是不能保證你在堆疊中所使用的空間會馬上被回收,垃圾回收機制只有在你的你堆疊已經毫無空間可以使用的情況下,才會真的去進行回收的動作,因此在程式設計上,還是要避免記憶體空間的浪費。

[编辑] 接口和类別

Java自带了创建接口的类別,可以这样使用:

public interface Deleteable {
   void delete();
}

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

public class Fred implements Deleteable {
    //Must include the delete () method to satisfy the Deleteable interface
    public void delete() { //code implementation goes here
    }
    //Can also include other methods
    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 5.0的特性

[编辑] 自動裝箱/拆箱 (Auto-Boxing/Unboxing)

沒有自動裝箱/拆箱:

int int1 = 1;
Integer integer2 = new Integer(int1);
int int3 = integer2.intValue();

有自動裝箱/拆箱:

int int1 = 1;
Integer integer2 = int1;     // 自動裝箱
int int3 = integer2;         // 自動拆箱

[编辑] 泛型 (Generic Types)

泛型就像是C++的模板。原有的Collection API加上泛型支援後,增加對型別的檢查,減少程式錯誤的機會。

沒有泛型:

HashMap hm = new HashMap();
int i=1;
String tt="test";
hm.put(new Integer(i), tt);

使用Generic:

HashMap <Integer, String>hm = new HashMap<Integer, String>();
int i=1;
String tt = "test";
hm.put(i, tt);      // 在這裏對int自動裝箱成Integer,也使用了參數的型別檢查

自動裝箱的新功能,可能是從C#語言身上學習來的,Java 已經越來越像C#。然而Java對自動裝箱/拆箱的支援,僅是利用編譯器實現,在Java Bytecode 中,並無自動裝箱/拆箱的操作碼 (opcode)。

[编辑] 註釋 (Annotation)

Annotation全名是Program Annotation Facility ,是Java SE 5.0的新功能。Java 的 Annotation 類似於 .NET 的屬性 (Attribute)。Java 的註釋是一種接口 (interface),繼承自 java.lang.annotation.Annotation。Class File 則貼上 ACC_ANNOTATION 標籤。

// JDK 1.4
/**
 * @todo to be implemented
 **/
void gimmeSomeLoving() {
  throw new Exception("not implemented");
}
// JDK 1.5
@todo void gimmeSomeLoving() {
  throw new Exception("not implemented");
}

[编辑] 枚举类型 (enum)

枚举类型也是J2SE 5.0的新功能。過去 Java 認為 enum 的關鍵字是不必要的功能,因為用 public static int field 就可以取代 enum,因此過去一直不用。J2SE 5.0中的 class 如果是 enum,在 class file 中會被貼上一個 ACC_ENUM 標籤。

// JDK 1.4
class JavaTech {
       public static final int J2ME = 1;
       public static final int J2SE = 2;
       public static final int J2EE = 3;
}
// JDK 1.5
public enum NewJavaTech {
       J2ME, J2SE, J2EE
}

[编辑] 输入输出

試試用位於 java.io (package) 內的BufferedReader。請緊記要 import java.io.*;。尾部"*"是指示要 import 所有位於 java.io 內的,。

import java.io.*;
public class TestRead{
   public static void main(String[] args) throws IOException{
       BufferedReader bufread = new BufferedReader(System.in);
       String str;
       System.out.print("請輸入一句字串");
       str = bufread.readLine();
       System.out.println(str);
   }
}

程式碼解說: import java.io.* 是把整個包「打開」,那麼你便可以承繼該包的类,用內裡的类創建一個物件。其實 java.io.* 是預設 import 的,不過 Eclipse 會要求 import java.io 所以功夫不可小!

public class TestRead 是宣告一個「公開」的 class(類別),而名字是TestRead 。

public static void main(String[] args) 是一個主程式。雖然是 Method ,但 main method 對於 Java 執行器來說是第一個執行程式的地方,同樣離開了 main method 就等如離開了程式。main method 的宣告式是要背的,當然是有解,不過暫且不說。

BufferedReader bufread = new BufferedReader(System.in) 在此創建一個以 BufferedReader 為藍圖的物件 bufread ,bufread名字是任你定的。詳細來說是第一個BufferedReader 是宣告 bufread 是一個會「存儲」一個BufferedReader類的物件。new BufferedReader(System.in) 是指創建一個 BufferedReader 的物件。由於BufferedReader 需要一個輸入流,因此我們指定了 System.in 給 BufferedReader。

[编辑] 应用程序开发接口

在Java语言中,应用程序接口(API)化身成类,并且分组成为包。每个包中包含有相关的接口和类。对于不同的平台,Java提供了不同版本的包。

API的设定由升阳公司和其他公司通过JCP(Java社群程序)决定。任何公司和个人都可以参与这个工程,对API进行设计。

2004年IBMBEA公司准备联合对官方的Java开源软件工程进行支持,但是2005年初,升阳公司拒绝了这个支持。

[编辑] Hello World

下面这个程序显示“Hello, world!”然后结束运行:

public class HelloWorld {
  public static void main(String[] args) {
    System.out.println("Hello, world!");
  }
}

[编辑] 国际化

Java语言严格区分字节字符。字符的存储格式为UCS-2,从Java 5开始支持UTF-16字符。Java的程序遂可以使用Unicode字符进行书写。

下面就是一个合法的Java程序,里面包含了中文字符作为类的名称而不是字符串,这个程序可以在编译器中运行通过。

public class 哈囉世界 {
   private string 文本 = "哈囉世界";
}

[编辑] 其它

[编辑] 深入JAVA

[编辑] 数据类型

任何编程语言都免不了要定义变量,JAVA也不例外。JAVA的变量声明形式如下:

type name;

其中的type是数据类型名,name指定义的该数据类型的一个具体变量。

JAVA的内置数据类型主要有如下几种:

  • boolean : 布尔值,仅有两个常量,true和false.
  • byte :字节类型值,长度8位(一个字节),取值范围是-128至127。
  • short :短整型值,长度16位(两个字节),取值范围是-32768至32767。
  • int :整型值,长度32位(四个字节),取值范围是-2147483648至2147483647
  • long :长整型,长度64位(八个字节),取值范围是-9223372036854775808至9223372036854775807
  • float :单精度IEEE754浮点数,长度32位(四个字节)。
  • double :双精度IEEE754浮点数,长度64位(八个字节)。
  • char :字符型,长度16位,支持所有的Unicode和Ascii编码。

[编辑] JAVA关键字

[编辑] 關於Java的批評

Java試圖通過新的方式解決軟體編寫的複雜性。很多人認為Java語言做到了它承諾的一切。但是Java並不是一門完美的語言。

  • 並不是所有的工程和環境需要企業級別的複雜性,比如一個簡單的個人網站或者獨自編程的程式師所寫的程式。這些程式師會發現Java的複雜管理對於自己要做的程式來說過於強大了。
  • 一些人覺得Java在面向物件上面做的沒有RubySmalltalk純粹。但是最新出現的用Java實現的語言Groovy解決了這些問題。
  • 作為一種已經建立的新技術,Java顯然綜合了很多語言的特性,比如C++、C語言、Python等等。一些對於Java的評論認為Java的不變性在動搖。

[编辑] 語言問題

  • 有些程式師不喜歡原始類型(primitive type)和類(class)的分離,尤其是那些曾經使用過SmalltalkRuby的程式師。
  • Java的代碼相對於其他的代碼來說過於冗長,這與它的輕便化聲明相違背。
  • Java是一種單層繼承的語言。這也導致了程式師在試圖使用多重繼承時候的不便,而很多語言都可以使用這個特性。但是Java可以使用介面類,把多重繼承可能導致的風險減少到最小。
  • Java不支持運算符重載,這是為了防止運算符重載使得代碼的功能變的不清晰。但是用Java實現的語言Groovy可以進行運算符重載
  • 過去Java對於文本的操作和其他語言,比如PerlPHP相比差的較多,但Java在1.4版本時候引入了正则表达式
  • 準確地說,JAVA不是平臺無關的,它本身就是一個平臺。

[编辑] 類庫問題

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

[编辑] 性能問題

由於Java編譯器和虛擬機的不同對Java代碼的性能影響比語言本身的影響大的多,所以統一討論Java的程式的性能經常是有誤導性的。據IBM的資料,在同樣的硬體上2001年時的IBM JDK版本的性能是1996年的JDK版本的十倍左右。見IBM東京研究院的資料: http://www.is.titech.ac.jp/ppl2004/proceedings/ishizaki_slides.pdf 而即使是在同一時期,不同公司的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可以專注於其他方面的工作。

關於Java的性能,可以參看以下文章:

http://www-128.ibm.com/developerworks/cn/java/j-jtp09275.html

http://www.matrix.org.cn/thread.shtml?topicId=16092&forumId=18

[编辑] Java运行时环境

Java运行时环境,即Java Runtime Environment,简称为JRE,是在任何平台上运行Java编写的程序都需要用到的软件。终端用户可以以软件或者插件方式得到和使用JRE。Sun公司还发布了一个JRE的更复杂的版本,叫做JDK,即Java 2 开发包,里面包含了Java需要的编译器、参考文档和调试器等。

JRE的成分:

  • Java的类库,包含了编译Java程序所需要的最核心文件。
  • 核心库文件,其中有
  • 数据结构的库,包括列表、字典和树等
  • XML分析库
  • 安全方面应用库
  • 国际化和本地化应用库
  • 综合库文件,包含了程序员和其他系统通信的功能文件。
  • JDBC,即Java数据库联通的API
  • JNDI,即Java命名和目录接口
  • RMICORBA用于重新分发软件
  • 用户界面库文件,包含:
  • AWT,即抽象窗口开发包,提供了产生图形用户界面所需要的功能
  • Swing
  • 其他用于回访媒体文件、录音、截图的库
  • 一个用于执行软件的Java虚拟机
  • 插件,可以在浏览器里面使用
  • JWS,可以让终端用户连接到互联网
  • 许可文件和文档

[编辑] 扩展和相关架构

扩展和与Java程序设计语言紧密相关的架构(按字母排序)。

  • Groovy ,一种用纯Java实现的脚本语言,Python的强有力竞争者
  • JAIN (Java API for Integrated Networks)Java综合网络应用程序开发接口
  • JAI,(Java Advanced Imaging)Java进阶图像
  • JAXP, (Java API for XML Processing) Java XML 處理 API
  • Java EE(原名J2EE),Java平台企业版
  • Java ME(原名J2ME) ,Java平台微型版为PDA智能手机开发的移动版本
  • Java SE(原名J2SE),Java平台标准版
  • JDBC ,(Java Database Connectivity)Java数据库联通
  • JDMK,(Java Dynamic Management Kit)Java动态管理开发包
  • JDO ,(Java Data Objects)Java数据对象
  • JJSF,Java服务器界面
  • JMF,(Java Media Framework) Java媒体框架
  • JMI,Java元数据接口
  • JML ,(Java Modeling Language)Java建模软件
  • JMX ,(Java Management Extensions)Java管理扩展
  • JNDI ,(Java Naming and Directory Interface)Java命名和目录接口
  • JNI ,Java原始界面
  • JOGL,使用OpenGL的低阶三位游戏开发接口
  • JSML ,(Java Speech API Markup Language)Java的语音和标记语言
  • JSP ,(JavaServer Pages)Java服务器页面
  • JSF ,(JavaServer Faces)
  • JXTAP2P虚拟网络协议
  • Java Card
  • Java3D ,用于三维游戏编程的高阶应用程序开发接口
  • JavaSpaces
  • Jini ,Java网络分布计算结构
  • Jiro
  • OSGi,(Dynamic Service Management and Remote Maintenance)动态服务管理和远程控制
  • Rhino, 用Java实现的JavaScript语言。
  • Swing, Java 的圖像用戶界面 API
  • SWT, Standard Widget Toolkit, 由IBMEclipse基金會主導開發的開源圖像用戶界面API
  • SuperWaba ,手持设备的虚拟机程序

[编辑] 参见

JNI(Java Native Interface)Java本地接口

[编辑] 参考文献

[编辑] 外部链接

[编辑] 昇陽公司

[编辑] 技术开发

[编辑] 集成开发环境IDE

[编辑] 一般应用

[编辑] Java历史

[编辑] Java评论

[编辑] 注釋

  1. ^ In Java 5.0, several features (the enhanced for loop, autoboxing, varargs, annotations and enums) were introduced, after proving themselves useful in the similar (and competing) language C#. [1][2][3]