最近我们收到一封电子邮件,咨询 “什么是Java?”条目的信息。在2006年,难道还有人不知道“什么是Java”吗?十年来,有大量介绍Java的书籍、网站和会议,难道不是所有人都知道“什么是Java”吗?显然答案是否定的。
毕竟,情况已经改变。
每个涉及applet和实时(Just-in-time)编译器的含糊定义都有许多已固定下来并为许多人所了解的新说明和新事实,但它们并非全部都写入文档中了。过去,Java常常意味着:
•Applet
•字节码解释
•缓慢的性能
•等待Sun恩赐的“拜物教”
而如今,它意味着:
•Web应用程序、Web服务、SOA等等
•热点动态编译
•高性能
•一个日益独立于Sun的开源社区
过去有个口号叫做“一次编写,随处运行”,这仍然是事实,但编写的内容及其运行环境和方式正在改变。
Java编程语言
Java是一种面向对象的高级编程语言,它在许多方面受到C、C++和Smalltalk的影响,还借用了其他语言的概念。其语法的设计方式使得那些熟悉 “大括号”语言(继承自C)的人也会熟悉Java语法,但它具有比C++更强的面向对象性、对象的静态类型转换以及相当严格的异常系统,该系统要求调用堆 栈中的每个方法要么处理异常,要么声明其抛出异常的能力。当然还有垃圾自动收集功能,这使开发人员不必释放由废弃对象占用的内存。
Java的一个比较受争议的方面(这些方面在发布Java时被广为接受,但现在正日益受到批评)是它的不完全的面向对象性。具体来说, Java基本类型(如int、char、boolean等等)都不是对象,并且开发人员需要以完全不同的方式来处理它们:由于int不是类,因此不能为其 创建子类并为其声明新方法,也不能将它传递给需要普通对象的方法,诸如此类。基本类型提高了Java的性能,但却降低了代码的清晰度,这一点使用所谓的 “包装器类”(Integer、Character和Boolean)的人应该深有体会。Java 5.0引入了autoboxing(自动装箱)模式,以消除许多使用包装器类的用例,但在某些方面这使代码的功能不那么明显了。
从理论上讲,Java是种“早期出错”语言。由于它的语法约束,许多编程错误在Java中不可能出现。由于不能直接访问指针,所以指针 运算错误也就不存在了。使用对象时的类型如果与当初声明它的类型不同,就会要求进行显式的类型转换,这使编译器能够拒绝不合逻辑的编程,如对一幅图像调用 一个字符串方法。
许多Java企业框架都要求使用配置文件或者部署描述符(通常用XML编写)来指定操作:哪个类处理特定的HTTP请求、在规则引擎中 执行的步骤顺序等等。实际上,要实现这些功能不能只用这种语言。评论人士指出,这会产生不当后果:不仅避开了Java编译器的检查,而且开发人员无法再 (只)根据程序的源代码就可确定它如何运行。Java 5.0为该语言添加了注释(annotation)特性,它允许使用值为方法、字段和类添加标签,在运行时,通常可通过反射对这些值进行内省和操作。许多 程序员喜欢注释,因为它简化了工作,否则就需要通过部署描述符或其他方法来解决问题。但是,注释也有可能使Java代码难以理解,因为注释的有无可能会影 响代码的执行方式,而这从注释中不太容易看出来。
尽管存在这么多的批评意见,但Java通常还是被认为是当今最流行的通用计算语言。在企业编程领域,它是一个广泛使用的标准,而且 2005年它取代C++成为SourceForge项目使用最多的语言。使用Java有很多好处:免费的工具(适用于多种平台:Linux、 Windows、Solaris和Mac均可编译和执行Java应用程序)、内容丰富的知识库以及大量乐意提供帮助的开发人员。
Java语言已经达到了开发人员生产率与代码性能之间的一个特定平衡点:CPU周期成本持续降低,但开发人员的开发周期却并未明显缩 短,因此在开发人员与CPU操作码执行之间再出现一个抽象层也许是不可避免的了,它将使开发人员能够更快地创建更好的软件。实际上,Java生产率的批评 者(如《Beyond Java》的Bruce Tate)可能正是观察到了这种不断推进Java使其达到新的平衡点,从而进一步牺牲性能去换取更高的开发人员生产率的趋势。
Java平台
通常有三种Java平台:Standard Edition(标准版,SE)、Enterprise Edition(企业版,EE)和Micro Edition(微型版)。每个平台都是一个包含某个语言版本、一组标准库和执行代码的虚拟机(见下文)的组合。EE是SE的超集,任何EE应用程序都可 假定所有的SE库都存在。EE平台的语言使用与SE的一样。
由于小型设备(如:电话或机顶盒)的局限性,Java Micro Edition与另两个版本有很大区别。它并非SE的子集(像SE是EE的子集那样),因为它的一些库只存在于Micro Edition中。而且,ME取消了一些语言特性,如float类型和Float类,这反映了它的运行平台的局限性。ME需要与SE和EE不同的工具,而 且设备之间的巨大差异使ME领域代码的可移植性更加不现实,因此许多Java开发人员将ME视为异类。