本书使用Java语言来讲解编程的基础知识。虽然其他编程语言也可以用来达到此目的,但是由于以下两个原因,本书选择了Java:首先,它是世界上使用最广泛的计算机语言之一。所以从实际的观点看,它是绝佳的学习语言。其次,它设计和实现了一些特性,这些特性使得对编程基础知识的介绍变得简单。但是还有第三个原因。Java展现了现代编程的许多特点。对Java的理解可以使你像专业程序员一样看待和思考编程工作。它是这个时代定义的语言之一。计算机语言演进是一个正在进行的历史过程,而Java是其中的一个环节。它既从丰富的历史积淀中继承到其最佳元素,又因其独一无二的地位激发出许多创新概念。本书的剩余部分将在描述Java的实用要点的同时,探究其创造的原因与使其成为现在这个样子的驱动力,并考查它从前人所继承来的宝贵财富。
Java由Sun Microsystems的James Gosling等人于1991年构思而成。最初,这种语言称为“Oak”。在1995年,它重命名为“Java”。尽管Java如今不可避免地与网络环境联系在一起,但是Java诞生的原动力却不是互联网。其动力源于需要一种与平台无关的语言,由它创建的软件要能嵌入进众多消费电子设备中(如微波炉、遥控器等)。也许你已猜到,不同种类的CPU均可用做消费电子设备的控制器。但麻烦的是,在当时,几乎所有的计算机语言设计成只能编译成某种特定CPU的机器指令。例如,另外一种语言C++就是如此,它在当时也十分流行(现在也很流行)。尽管有可能针对任意一种CPU编译C++程序,但这要求有为那种CPU设计的完整的C++编译器。这是因为C++通常编译成由CPU直接运行的机器指令。然而,创建编译器代价高昂,费时众多。为了找到更好的解决方案,Gosling等人开始致力于开发一种轻量级、跨平台的语言,能够产生在不同环境各种CPU下运行的代码。它们的努力最终导致了Java的诞生。在详细开发Java的同时,另一股更加重要的力量同时诞生,在未来Java的发展中起到了至关重要的作用。这股力量即是万维网(World Wide Web)。如果Web不与Java的实现几乎同时形成,Java也许将还是一种有用但仅仅用于消费电子的不知名编程语言。由于Web需要可移植的程序,随着Web的兴起,Java也跃至计算机语言设计的风口浪尖。进一步的原因在于,互联网由各种计算机组成,它们使用不同种类的CPU和操作系统。人们非常希望拥有让各种各样的计算机运行相同程序的方法。直到1993年,Java设计团队的成员发现:为嵌入式控制器创建代码时经常遇到的可移植性问题在试图为互联网创建代码时也常常遇到。这个现实使得Java的重心由消费电子转移到互联网编程上。所以,尽管Java原本起源于开发与架构无关的编程语言的需求,但是其实是互联网最终促使了Java的大规模成功。值得注意的是,Java与两种较早的程序设计语言直接相关。这两种语言是C语言和C++语言。Java从C语言继承语法。其对象模型由C++改进而来。Java与C和C++的关系十分重要。在创建Java时,许多编程人员熟悉C和C++的语法。这使得C和C++程序员学习Java更加容易。反过来说,也使得Java程序员学习C和C++语言更加容易。更进一步,Java设计人员不需要在许多已经做过的事情上重新白费力气。它们只需要移植、改善和充实那些已经成功运用的程序模板。由于Java和C++的相似之处,特别是在于面向对象编程的相似之处,我们有可能会简单地将Java视作互联网版的C++。但是这也许会带来误解。Java有着重要的不同。尽管Java受C++的影响,但它不是增强版的C++。例如,它不与C++前向或后向兼容。另外,Java也无意替代C++。Java用来解决特定的一些问题,C++用来解决另一些特定的问题。两者都会在许多年内共存。
互联网帮助Java跃升至编程的前沿,而Java反过来又对互联网有深远的影响。Java不但简化了互联网编程的一般过程,还创造了一种新的网络程序形式,称为applet(小应用程序)。在当时,它改变了网络世界对内容的认识。Java也专注于解决与互联网有关的缺点:可移植性和安全性。下文将更详细地介绍这两点。
applet是一种特殊的Java程序,它设计于在互联网上传输,然后在与Java兼容的网络浏览器上自动执行。此外,applet可以按需下载。如果用户点击了含有applet的链接,applet将自动下载并在浏览器上运行。applet是为小型程序所设计的。它们一般用来显示服务器提供的数据、处理用户输入、提供在本地执行的(而不是在服务器上执行的)简单功能(如贷款计算器等)。本质上,applet允许我们将一些功能从服务器转移到客户端上。它使得更多对象能够在网络空间中自由传送。于是,applet的诞生改变了互联网编程。尽管applet令人满意,但它们也在安全性和可移植性领域面临着挑战。显然,应该阻止从客户机上自动下载和执行的程序做坏事。同时,它必须能够在各种不同的环境和不同的操作系统下运行。你将会看到,Java以一种有效而优雅的方式解决了这些问题。下文将逐一更详细地介绍这些问题。
你很可能会意识到下载每一个看似正常的程序都伴随着风险,因为下载的代码可能包括病毒、木马或其他有害代码。问题的关键在于:倘若恶意代码能够非法访问系统资源,它就能带来损害。例如,病毒也许会通过搜索计算机的本地文件系统来收集私人信息,如信用卡号、银行账号、密码等。Java为了能使applet在客户机上安全下载和执行,必须阻止applet发起这样的攻击。Java把applet限制在Java执行环境中,不允许其访问计算机的其他部分。这样就实现了保护功能。在后文将会说明这是怎样实现的。保证applet能够无害下载的能力和坚不可摧的安全性是Java最重要的特性之一。
在互联网中,可移植性是一个主要因素。这是因为网络上连接了许多不同种类的计算机和操作系统。Java程序要想运行在几乎所有的连入互联网的计算机上,它就要有使程序在不同系统上执行的方法。例如,就applet而言,同一applet必须能够在不同的CPU、操作系统和浏览器上下载和执行。为不同的计算机准备不同版本的applet是不现实的,同样的代码必须在所有的计算机上工作。于是,就需要有一些生成可移植代码的方法。值得高兴的是,帮助实现安全性的方法同样也能实现可移植性。
允许Java同时解决上述安全性和可移植性问题的关键是Java编译器并没有直接输出可执行的机器指令。与之相反,它输出字节码。字节码(bytecode)是一种高度优化的指令集,可由Java虚拟机(Java Virtual Machine,JVM)执行。实际上,JVM最初用来做字节码的解释器。由于JVM执行Java程序,因此它解决了与Web程序有关的主要可移植性和安全性问题。这就是Java能够解决网络应用主要问题的原因。将Java程序编译为字节码使得程序更容易在不同的环境下运行,因为只有Java虚拟机需要在每个平台上实现。一旦在某个给定系统中有JVM,在其上就可以运行Java程序。尽管不同平台上JVM的实现细节并不相同,但是所有解释器都解释同一Java字节码。如果把Java程序编译成本地代码,同一程序的不同版本就会在连接互联网的不同CPU上运行。这当然不是一个可行的解决方案。于是,由JVM执行字节码是创建真正可移植性程序的最简单的方式。由JVM执行Java程序也能帮助保证安全性。因为JVM掌握着控制权,所以它能包含程序,防止其在系统外产生副作用。Java语言的其他限制也增强了安全性。一般情况下,用虚拟机运行程序会比运行编译成可执行机器指令的相同程序要慢。但是对于Java而言,这两者的差别并不巨大。因为字节码已高度优化,使用字节码使JVM能够运行的比想象中快得多。另外,也可以将字节码编译成机器指令以提升性能。这个编译过程是瞬时完成的,通过使用字节码的即时(Just-In-Time,JIT)编译器来实现。JIT编译器是JVM的一部分。它根据需要选取字节码片段,将其实时编译成可执行代码。在此强调:JIT编译器并不一次性把整个Java程序编译成可执行代码。此外,JIT并不会编译所有的字节码序列。它只编译那些能通过编译获得好处的代码。甚至当动态编译字节码时,可移植性和安全性特性依然存在,因为JVM仍然控制着执行环境。最后说明一点:JVM是Java运行时环境的一部分。Java运行时环境称为Java Runtime Environment,其缩写为JRE。1.4.7 Java的演进只有一小部分语言组成了编程最本质的部分。在这样的“精英团队”里,Java由于其快速性和广泛性鹤立鸡群。可以毫不夸张地说,由Sun Microsystems公布的Java 1.0的原始版本引发了编程的革命。Java不仅使Web变成一个高互动性的环境,它还为计算机语言设计树立了新标准。多年以来,Java持续发展、演进,重新定义自己。不像那些缓慢支持新特性的其他语言,Java总是走在计算机语言开发的前沿。其原因之一在于创新的文化和Java周边的变化。于是,Java经过了多次升级,其中一些升级相对较小,另一些较重要。在本书写作时,Java的目前版本称为Java SE 7,其附带的Java开发工具包(Java Development Kit)称为JDK 7。Java SE 7中的“SE”是标准版(Standard Edition)的意思。Java SE 7是Oracle收购Sun Microsystems后的第一个主要版本。Java SE 7包含许多新特性。其中一些新特性将在本书中指出。
相关资源:JAVA上百实例源码以及开源项目源代码