第1章Java的起源
对于计算机语言的发展史,业界一般认为:B语言导致了C语言的诞生,C语言演变出了C++语言,而C++语言将让位于Java语言。要想更好地了解Java语言,就必须了解它产生的原因、推动它发展的动力,以及它对其他语言的继承。像以前其他成功的计算机语言一样,Java继承了其他语言的先进原理,同时又因其独特的环境要求而提出了一些创新性的概念。在这本书的其他各章中,将从实用的角度,对Java语言、库及应用程序进行包括语法在内的详细介绍。在本章里,我们将介绍Java语言产生的背景、发展过程,以及使它变得如此重要的原因。
尽管Java语言已和Internet的在线环境密不可分,但首先应该注意到的最重要一点是:
它是一种程序语言。计算机语言的革新和发展需要2个基本因素的驱动:
· 适应正在变化的环境和需求
· 实现编程艺术的完善与提高
下面你将看到,Java也正是在这两个因素的驱动下产生的。
1.1 Java的由来
Java总是和C++联系在一起,而C++则是从C语言派生而来的,所以Java语言继承了这两种语言的大部分特性。Java的语法是从C继承的,Java许多面向对象的特性受到C++的影响。事实上,Java中几个自定义的特性都来自于或可以追溯到它的前驱。而且,Java语言的产生与过去30年中计算机语言细致改进和不断发展密切相关。基于这些原因,本节将按
序回顾促使Java产生的事件和推动力。正如你将看到的一样,每一次语言设计的革新都是因为先前的语言不能解决目前遇到的基本问题而引起。Java也不例外。
1.1.1 现代的编程语言的诞生:C语言
C语言的产生震撼了整个计算机界。它的影响不应该被低估,因为它从根本上改变了编程的方法和思路。C语言的产生是人们追求结构化、高效率、高级语言的直接结果,可用它替代汇编语言开发系统程序。当设计一种计算机语言时,经常要从以下几方面进行权衡:
· 易用性与功能
· 安全性和效率性
· 稳定性和可扩展性
C语言出现以前,程序员们不得不经常在有优点但在某些方面又有欠缺的语言之间做出选择。例如,尽管公认FORTRAN在科学计算应用方面可以编写出相当高效的程序,但它不适于编写系统程序。BASIC虽然容易学习,但功能不够强大,并且谈不上结构化,这使它应用到大程序的有效性受到怀疑。汇编语言虽能写出高效率的程序,但是学习或有效地使用它却是不容易的。而且,调试汇编程序也相当困难。另一个复杂的问题是,早期设计的计算机语言(如BASIC,COBOL,FORTRAN等)没有考虑结构化设计原则,使用GOTO语句作为对程序进行控制的一种主要方法。这样做的结果是,用这些语言编写的程序往往成了“意大利面条式的程序代码”,一大堆混乱的跳转语句和条件分支语句使得程序几乎不可能被读懂。Pascal虽然是结构化语言,但它的设计效率比较低,而且缺少几个必需的特性,因而无法在大的编程范围内使用(特别是,给定的Pascal的标准语言在特定时间是可用的,但将Pascal作为系统级编码是不切实际的)。因此,在C语言产生以前,没有任何一种语言能完全满足人们的需要,但人们对这样一种语言的需要却是迫切的。在20世纪70年代初期,计算机革命开始了,对软件的需求量日益增加,使用早期的计算机语言进行软件开发根本无法满足这种需要。学术界付出很多努力,尝试创造一种更好的计算机语言。但是,促使C语言诞生的另一个,也许是最重要的因素,是计算机硬件资源的富余带来了机遇。计算机不再像以前那样被紧锁在门里,程序员们可以随意使用计算机,可以随意进行*尝试,因而也就有了可以开发适合自己使用的工具的机会。所以,在C语言诞生的前夕,计算机语言向前飞跃的时机已经成熟。在Dennis Ritchie第一个发明和实现在DEC PDP-11上运行UNIX操作系统时,一种更古老的由Martin Richards设计的BCPL语言导致了C语言的产生。受BCPL语言的影响,由KenThompson发明的B语言,在20世纪70年代逐渐向C语言发展演变。在此后的许多年里,由Brian Kernighan和Dennis Ritchie编写的《The C Programming Language》(Prentice-Hall,1978)被认为是事实上的C语言标准,该书认为C只是支持UNIX 操作系统的一种语言。1989年12月,美国国家标准化组织( ANSI )制定了C语言的标准,C语言被正式标准化。许多人认为C语言的产生标志着现代计算机语言时代的开始。它成功地综合处理了长期困扰早期语言的矛盾属性。C语言是功能强大、高效的结构化语言,简单易学,而且它还包括一个无形的方面:它是程序员自己的语言。在C语言出现以前,计算机语言要么被作为学术实验而设计,要么由官僚委员会设计。而C语言不同。它的设计、实现、开发由真正的从事编程工作的程序员来完成,反映了现实编程工作的方法。它的特性经由实际运用该语言的人们不断去提炼、测试、思考、再思考,使得C语言成为程序员们喜欢使用的语言。确实,C语言迅速吸引了许多*的追随者,因而很快受到许多程序员的青睐。简言之,C语言是由程序员设计并由他们使用的一种语言。正如你将看到的,Java继承了这个思想。
1.1.2 对C++的需要
在20世纪70年代末和80年代初,C成为了主流的计算机编程语言,至今仍被广泛使用。你也许会问,既然C是一种成功且有用的语言,为什么还需要新的计算机语言?答案是复杂性(complexity)。程序越来越复杂这一事实贯穿编程语言的历史。C++正是适应了这一需求。下面介绍为什么对程序复杂性的更好管理是C++产生的基本条件。自从计算机发明以来,编程方法经历了戏剧性的变化。例如,当计算机刚发明出来时,编程是通过面板触发器用人工打孔的办法输入二进制机器指令来实现的。对于只有几百行的程序,这种办法是可行的。随着程序不断增大,人们发明了汇编语言,它通过使用符号来代替机器指令,这样程序员就能处理更大、更复杂的程序。随着程序的进一步增大,高级语言产生了,它给程序员提供了更多的工具来处理复杂性问题。
第一个被广泛使用的高级语言当然是FORTRAN。尽管FORTRAN最初给人留下了深刻的印象,但它无法开发出条理清楚易于理解的程序。20世纪60年代提出了结构化编程方法。这种结构化的编程思想被像C这样的语言所应用,第一次使程序员可以相对轻松地编写适度复杂的程序。然而,当一个工程项目达到一定规模后,即使使用结构化编程方法,编程人员也无法对它的复杂性进行有效管理。20世纪80年代初期,许多工程项目的复杂性都超过了结构化方法的极限。为解决这个问题,面向对象编程(object-oriented programming,OOP)新方法诞生了。面向对象的编程在这本书的后面详细讨论,但在这里给出一个简短的定义:面向对象的编程是通过使用继承性、封装性和多态性来帮助组织复杂程序的编程方法。
总之,尽管C是世界上伟大的编程语言之一,但它处理复杂性的能力有限。一旦一个程序的代码超过25 000~100 000行,就很难从总体上把握它的复杂性了。C++突破了这个限制,帮助程序员理解并且管理更大的程序。
1979年,当Bjarne Stroustrup在新泽西州的Murray Hill实验室工作时,发明了C++。Stroustrup 最初把这种新语言称为“带类的C”。1983年,改名为C++。C++通过增加面向对象的特性扩充了C。因为C++产生在C的基础之上,因此它包括了C所有的特征、属性和优点。这是C++作为语言成功的一个关键原因。C++的发明不是企图创造一种全新的编程语言,而是对一个已经高度成功的语言的改进。C++在1997年11月被标准化,目前的标准是ANSI/ISO。
1.1.3 Java出现的时机已经到来
在20世纪80年代末和90年代初,使用面向对象编程的C++语言占主导地位。的确,有一段时间程序员似乎都认为已经找到了一种完美的语言。因为C++有面向对象的特征,又有C语言高效和格式上的优点,因此它是一种可以被广泛应用的编程语言。然而,就像过去一样,推动计算机语言进化的力量正在酝酿。在随后的几年里,万维网(WWW)和Internet达到临界状态。这个事件促成编程的另一场革命。
1.2 Java的产生
Java是由James Gosling,Patrick Naughton,Chris Warth,Ed Frank和Mike Sheridan于1991年在Sun Microsystems公司设计出来的。开发第一个版本花了18个月。该语言开始名叫“Oak”,于1995年更名为“Java”。从1992 的秋天Oak问世到1995的春天公开发布Java语言,许多人对Java的设计和改进做出了贡献。Bill Joy,Arthur van Hoff,Jonathan Payne,Frank Yellin和Tim Lindholm是主要的贡献者,正是他们的贡献使最初原型得以成熟。说起来多少有些令人吃惊,Java的最初推动力并不是因特网!而是源于对独立于平台(也就是体系结构中立)语言的需要,这种语言可创建能够嵌入微波炉、遥控器等各种家用电器设备的软件。用作控制器的CPU芯片是多种多样的,但C和C++以及其他绝大多数语言的缺点是只能对特定目标进行编译。尽管为任何类型的CPU芯片编译C++程序是可能的,但这样做需要一个完整的以该CPU为目标的C++编译器,而创建编译器是一项既耗资巨大又耗时较长的工作。因此需要一种简单且经济的解决方案。为了找到这样一种方案,Gosling和其他人开始一起致力于开发一种可移植、跨平台的语言,该语言能够生成运行于不同环境、不同CPU芯片上的代码。他们的努力最终促成了Java的诞生。在Java的一些细节被设计出来的同时,第二个并且也是最重要的因素出现了,该因素将对Java的未来起着至关重要的作用。这第二个因素当然就是万维网(WWW)。如果万维网(WWW)的成型和Java的实现不是同时发生的话,那么Java可能保持它有用、但默默无闻的用于电子消费品编程语言的状态。然而,随着万维网的出现,Java被推到计算机语言设计的最前沿,因为万维网也需要可移植的程序。绝大多数程序员在涉足编程领域时就知道可移植的程序像他们的理想一样难以捉摸。尽管人们对高效的、可移植的(独立于平台)编程方式的追寻几乎和编程历史一样久远,但它总是让位于其他的更为紧迫的问题。此外,因为计算机业被Intel,Macintosh和UNIX
这3个竞争对手垄断,大多数程序员都在其中的某个领域内长期工作,所以对可移植语言的需求就不是那么迫切。但是,随着因特网和Web的出现,关于可移植性语言的旧问题又被提了出来。毕竟,因特网由不同的、分布式的系统组成,其中包括各种类型的计算机、操作系统和CPU。尽管许多类型的平台都可以与因特网连接,但用户仍希望他们能够运行同样的程序。曾经是一个令人烦恼却无需优先考虑的问题现在变成了急需解决的问题。
1993年,Java设计小组的成员发现他们在编制嵌入式控制器代码时经常遇到的可移植性问题,在编制因特网代码的过程中也出现了。事实上,开始被设计为解决小范围问题的Java语言同样可以被用在大范围的因特网上。这个认识使他们将Java的重心由电子消费品转移到Internet编程。因此,中立体系结构编程语言的需要是促使Java诞生的源动力,Internet却最终导致了Java的成功。
正如前面提到的,Java的大部分特性是从C和C++中继承的。Java设计人员之所以故意这么做,主要是因为他们觉得,在新语言中使用熟悉的C语法及模仿C++面向对象的特性,将使他们的语言对经验丰富的C/C++程序员有更大的吸引力。除了表面类似外,其他一些促使C和C++成功的因素也帮了Java的忙。首先,Java的设计、测试、精炼由真正从事编程工作的人员完成,它根植于设计它的人员的需要和经验,因而也是一个程序员自己的语言。其次,Java是紧密结合的且逻辑上是协调一致的。最后,除了那些Internet环境强加的约束以外,Java给了编程人员完全的控制权。如果你程序编的好,你编写的程序就能反映出这一点。相反,如果你的编程手法拙劣,也能在你的程序中反映出来。换一种说法,Java并不是训练新手的语言,而是供专业编程人员使用的语言。由于Java和C++之间的相似性,容易使人将Java简单地想象为“C++的版本”。但其实这是一种误解。Java在实践和理论上都与C++有重要的不同点。尽管Java受到C++的影响,但它并不是C++的增强版。例如,Java与C++既不向上兼容,也不向下兼容。当然,Java与C++的相似之处也是很多的,如果你是一个C++程序员,你会感觉到对Java非常熟悉。另外一点是:Java并不是用来取代C++的,设计Java是为了解决某些特定的问题,而设计C++是为了解决另外一类完全不同的问题。两者将长时间共存。正如本章开始提到的,计算机语言的革新靠两个因素驱动:对计算环境改变的适应和编程艺术的进步。环境的变化促使Java这种独立于平台的语言注定成为Internet上的分布式编程语言。同时,Java也改变了人们的编程方式,特别是Java对C++使用的面向对象范例进行的增强和完善。所以,Java不是孤立存在的一种语言,而是计算机语言多年来的演变结果。仅这个事实就足以证明Java在计算机语言历史上的地位。Java对Internet编程的影响就如同C对系统编程的影响一样:革命的力量将改变世界。
1.3 Java对Internet为什么重要
Internet使Java成为网上最流行的编程语言,同时Java对Internet的影响也意义深远。原因相当简单:Java扩展了可以在赛百空间*流动的对象的世界。在网络中,有两大类对象在服务器和个人计算机之间传输:被动的信息和动态的、主动的程序。例如,当你阅读电子邮件时,你在看被动的数据。甚至当你下载一个程序时,该程序的代码也是被动的数据,直到你执行它为止。但是,可以传输到个人计算机的另一类对象却是:动态的、可自运行的程序,虽然这类程序是客户机上的活动代理,但却是由服务器来初始化的。例如,被务器用来正确地显示服务器传送数据的程序。网上程序在动态性上是令人满意的,但它们在安全性和可移植性方面也显示出严重的
缺陷。在Java产生以前,当前赛百空间有一半的对象实体无法进入网络世界,是Java为它们打开了便利之门,而且在这个过程中定义了一种全新的程序形式:applet(小应用程序)。
1.3.1 Java小应用程序和应用程序
Java可用来生成两类程序:应用程序(applications)和Java applet(小应用程序)。应用程序是可以在你的计算机的操作系统中运行的程序,从这一方面来说,用Java编制的应用程序多多少少与使用C或C++编制的应用程序有些类似。在创建应用程序时,Java与其他计算机语言没有大的区别。而Java的重要性就在于它具有编制小应用程序的功能。小应用程序是可以在Internet中传输并在兼容Java的Web浏览器中运行的应用程序。小应用程序实际上就是小型的Java程序,能像图像文件、声音文件和视频片段那样通过网络动态下载,它与其他文件的重要差别是,小应用程序是一个智能的程序,能对用户的输入作出反应,并且能动态变化,而不是一遍又一遍地播放同一动画或声音。如果Java不能解决两个关于小应用程序的最棘手的问题:安全性和可移植性,那么小应用程序就不会如此令人激动。在继续下一个话题之前,让我们先说明以下这两个术语对Internet的意义。
1.3.2 安全性
正如你知道的那样,每次当你下载一个“正常”的程序时,你都要冒着被病毒感染的危险。在Java出现以前,大多数用户并不经常下载可执行的程序文件;即使下载了程序,在运行它们以前也都要进行病毒检查。尽管如此,大多数用户还是担心他们的系统可能被病毒感染。除了病毒,另一种恶意的程序也必须警惕。这种恶意的程序可通过搜索你计算机本地文件系统的内容来收集你的私人信息,例如信用卡号码、银行账户结算和口令。Java在网络应用程序和你的计算机之间提供了一道防火墙(firewall),消除了用户的这些顾虑。当使用一个兼容Java的Web浏览器时,你可以安全地下载Java小应用程序,不必担心病毒的感染或恶意的企图。Java实现这种保护功能的方式是,将Java程序限制在Java运行环境中,不允许它访问计算机的其他部分,后面将介绍这个过程是如何实现的。下载小应用程序并能确保它对客户机的安全性不会造成危害是Java的一个最重要的方面。
1.3.3 可移植性
正如前面所讨论的,许多类型的计算机和操作系统都连接到Internet上。要使连接到Internet上的各种各样的平台都能动态下载同一个程序,就需要有能够生成可移植性执行代码的方法。很快你将会看到,有助于保证安全性的机制同样也有助于建立可移植性。实际上,Java对这两个问题的解决方案是优美的也是高效的。
1.4 Java的魔力:字节码
Java解决上述两个问题——安全性和可移植性的关键在于Java编译器的输出并不是可执行的代码,而是字节码(bytecode)。字节码是一套设计用来在Java运行时系统下执行的高度优化的指令集,该Java运行时系统称为Java虚拟机(JavaVirtual Machine,JVM)。在其标准形式下,JVM 就是一个字节码解释器。这可能有点让人吃惊,因为像C++之类语言的编译结果是可执行的代码。事实上,出于对性能的考虑,许多现代语言都被设计为编译型,而不是解释型。然而,正是通过JVM运行Java程序才有助于解决在Internet上下载程序的主要问题。这就是Java输出字节码的原因。
将一个Java程序翻译成字节码,有助于它更容易地在一个大范围的环境下运行程序。
原因非常直接:只要在各种平台上都实现Java虚拟机就可以了。在一个给定的系统中,只
要系统运行包存在,任何Java程序就可以在该系统上运行。记住:尽管不同平台的Java虚拟机的细节有所不同,但它们都解释同样的Java字节码。如果一个Java程序被编译为本机代码,那么对于连接到Internet上的每一种CPU类型,都要有该程序的对应版本。这当然不是一个可行的解决方案。因此,对字节码进行解释是编写真正可移植性程序的最容易的方法。对Java程序进行解释也有助于它的安全性。因为每个Java程序的运行都在Java虚拟机的
控制之下,Java虚拟机可以包含这个程序并且能阻止它在系统之外产生副作用。正如你将
看到的,Java语言特有的某些限制增强了它的安全性。被解释的程序的运行速度通常确实会比同一个程序被编译为可执行代码的运行速度慢一些。但是对Java来说,这两者之间的差别不太大。使用字节码能够使Java运行时系统的程序执行速度比你想象的快得多。
尽管Java被设计为解释执行的程序,但是在技术上Java并不妨碍动态将字节码编译为本
机代码。SUN公司在Java 2发行版中提供了一个字节码编译器——JIT(Just In Time,即时)。
JIT是Java虚拟机的一部分,它根据需要、一部分一部分地将字节码实时编译为可执行代码。它不能将整个Java程序一次性全部编译为可执行的代码,因为Java要执行各种检查,而这些检查只有在运行时才执行。记住这一点是很重要的,因为JIT只编译它运行时需要的代码。尽管如此,这种即时编译执行的方法仍然使性能得到较大提高。即使对字节码进行动态编译后,Java程序的可移植性和安全性仍能得到保证,因为运行时系统(该系统执行编译)仍然能够控制Java程序的运行环境。不管Java程序被按照传统方式解释为字节码,还是被动态编译为可执行代码,其功能是相同的。
1.5 Java常用语
不介绍Java常用语,对Java的总体介绍就是不完整的。尽管促使Java诞生的源动力是可
移植性和安全性,但在Java语言最终成型的过程中,其他一些因素也起了重要的作用。Java
设计开发小组的成员总结了这些关键因素,称其为Java的专门用语,包括下面几个:
· 简单(Simple)
· 安全(Secure)
· 可移植(Portable)
· 面向对象(Object-oriented)
· 健壮(Robust)
· 多线程(Multithreaded)
· 体系结构中立(Architecture-neutral)
· 解释执行(Interpreted)
· 高性能(High performance)
· 分布式(Distributed)
· 动态(Dynamic)
在这些特性中,安全和可移植已经在前面介绍过了,下面让我们看看其他特性的含义。
1.5.1 简单
Java的设计目的是让专业程序员觉得既易学又好用。假设你有编程经历,你将不觉得
Java难掌握。如果你已经理解面向对象编程的基本概念,学习Java将更容易。如果你是一个经验丰富的C++程序员,那就最好了,学习Java简直不费吹灰之力。因为Java继承C/C++语法和许多C++面向对象的特性,大多数程序员在学习Java时都不会觉得太难。另外,C++中许多容易混淆的概念,或者被Java弃之不用了,或者以一种更清楚、更易理解的方式实现。除了和C/C++类似以外,Java的另外一个属性也使它更容易学习:设计人员努力使Java中不出现显得让人吃惊的特性。在Java中,很少明确地告诉你如何才能完成一项特定的任务。
1.5.2 面向对象
尽管受到其前辈的影响,但Java没被设计成兼容其他语言源代码的程序。这允许Java开发组*地从零开始。这样做的一个结果是,Java语言可以更直接、更易用、更实际的接近对象。通过对近几十年面向对象软件优点的借鉴,Java设法在纯进化论者的“任何事物都是一个对象”和实用主义者的“不讨论对象不对象”的论点之间找到了平衡。Java的对象模型既简单又容易扩展,对于简单数据类型,例如整数,它保持了高性能,但不是对象。
1.5.3 健壮
万维网上多平台的环境使得它对程序有特别的要求,因为程序必须在许多系统上可靠地执行。这样,在设计Java时,创建健壮的程序被放到了高度优先考虑的地位。为了获得可靠性,Java在一些关键的地方限制你,强迫你在程序开发过程中及早发现错误。同时,Java使你不必担心引起编程错误的许多最常见的问题。因为Java是一种严格的类型语言,它不但在编译时检查代码,而且在运行时也检查代码。事实上,在运行时经常碰到的难以重现的、难以跟踪的许多错误在Java中几乎是不可能产生的。要知道,使程序在不同的运行环境中以可预见的方式运行是Java的关键特性。为更好理解Java是如何具有健壮性的,让我们考虑使程序失败的两个主要原因:内存管理错误和误操作引起的异常情况(也就是运行时错误)。在传统的编程环境下,内存管理是一项困难、乏味的任务。例如,在C/C++中,程序员必须手工地分配并且释放所有的动态内存。这有时会导致问题,因为程序员可能忘记释放原来分配的内存,或者释放了其他部分程序正在使用的内存。Java通过替你管理内存分配和释放,可以从根本上消除这些问题(事实上,释放内存是完全自动的,因为Java为闲置的对象提供内存垃圾自动收集)。在传统的环境下,异常情况可能经常由“被零除”或“文件未找到”这样的情况引起,而我们又必须用既繁多又难以理解的一大堆指令来对它们进行管理。Java通过提供面向对象的异常处理机制来解决这个问题。一个写得很好的Java程序,所有的运行时错误都可以并且应该被你的程序自己进行管理。
1.5.4 多线程
设计Java的目标之一是为了满足人们对创建交互式网上程序的需要。为此,Java支持多线程编程,因而你用Java编写的应用程序可以同时执行多个任务。Java运行时系统在多线程同步方面具有成熟的解决方案,这使你能够创建出运行平稳的交互式系统。Java的多线程机制非常好用,因而你只需关注程序细节的实现,不用担心后台的多任务系统。
1.5.5 结构中立
Java设计者考虑的一个主要问题是程序代码的持久性和可移植性。程序员面临的一个主要问题是,不能保证今天编写的程序明天能否在同一台机器上顺利运行。操作系统升级、处理器升级以及核心系统资源的变化,都可能导致程序无法继续运行。Java设计者对这个问题做过多种尝试,Java虚拟机(JVM)就是试图解决这个问题的。他们的目标是“只要写一次程序,在任何地方、任何时间该程序永远都能运行”。在很大程度上,Java实现了这个目标。
1.5.6 解释性和高性能
前面已提到,通过把程序编译为Java字节码这样一个中间过程,Java可以产生跨平台运行的程序。字节码可以在提供Java虚拟机(JVM)的任何一种系统上被解释执行。早先的许多尝试解决跨平台的方案对性能要求都很高。其他解释执行的语言系统,如BASIC,Tcl,PERL都有无法克服的性能缺陷。然而,Java却可以在非常低档的CPU上顺利运行。前面已解释过,Java确实是一种解释性语言,Java的字节码经过仔细设计,因而很容易便能使用JIT编译技术将字节码直接转换成高性能的本机代码。Java运行时系统在提供这个特性的同时仍具有平*立性,因而“高效且跨平台”对Java来说不再矛盾。
1.5.7 分布式
Java为Internet的分布式环境而设计,因为它处理TCP/IP协议。事实上,通过URL地址存取资源与直接存取一个文件的差别是不太大的。Java原来的版本(Oak) 包括了内置的地址空格消息传递(intra-address-space)特性。这允许位于两台不同的计算机上的对象可以远程地执行过程。Java最近发布了叫做远程方法调用(Remote Method Invocation ,RMI)的软件包,这个特性使客户机/服务器编程达到了无与伦比的抽象级。
1.5.8 动态
Java程序带有多种的运行时类型信息,用于在运行时校验和解决对象访问问题。这使得在一种安全、有效的方式下动态地连接代码成为可能,对小应用程序环境的健壮性也十分重要,因为在运行时系统中,字节码内的小段程序可以动态地被更新。
1.6 继续 革 命
Java的最初发布本不亚于一场革命,但是它并不标志着Java快速革新时代的结束。与大多数其他软件系统经常进行小的改进不同,Java继续以爆炸式的步伐向前发展。在Java 1.0发布不久,Java的设计者已经创造出了Java 1.1。Java 1.1新增的特性远比普通意义上的版本修订有意义,内容要丰富许多。Java 1.1增加了许多新的库元素,重新定义了小应用程序处理事件的方法,并且重新设置了1.0版中库的许多特性。它也放弃了原来由Java1.0定义的若干过时的特征。因此,Java 1.1不但增加了Java 1.0中没有的属性,同时也抛弃了一些原有的属性。ava的第二个主要发布版本是Java 2。Java 2 是一个分水岭,它标志这个快速演变语言“现代时代”的开始!Java 2第一版本的版本号是1.2。这似乎有点奇怪。原因是它参考了原来Java库的版本,对于整个版本来说,它本身没有多大变化。Java 2增加了很多对新特性的支持,例如Swing和类集框架,并且它提高了Java虚拟机和各种编程工具的性能。Java 2也包含了一些不赞成继续使用的内容,主要是不赞成使用线程类中suspend( ),resume( )和stop( )这些方法。Java的当前版本是Java 2,1.3版。Java的这个版本是对Java 2原来版本的第一次最主要的升级。该版本增强了Java大部分现有的功能,并且限制了它的开发环境。总的来说,版本1.2和版本1.3的程序源代码是兼容的。尽管与前面3个版本相比,版本1.3作了一些小的改变,但这是无关紧要的。本书适合Java 2的1.2和1.3版。当然,大多数内容也适用于Java早期的版本。在本书中,当一个特性只适用于Java的一个特定的版本时,会被注明。否则,你就可以认为它适用于一般的Java版本。另外,对于适用于Java 2两个版本的那些特性,本书中将简单地使用术语Java 2,而不注明版本号。
1.7 Java不是增强的HTML
在继续讲解前,有必要澄清一个普遍的误解。因为Java被用来创建网页,所以初学者有时将Java与超文本标记语言(HTML)混淆,或认为Java仅仅是对HTML的一些改进。幸好,这只是误解。实质上,HTML是一种定义信息逻辑的组织方式并提供相关信息的链接(叫超文本链接)。你可能知道,超文本链接(hypertext link)(也叫超链接)是把一个超文本与另一个超文本文档链接起来的工具,而这个被链接的超文本文档可能在本地或万维网上其他地方。超文本文档要素的定义是通过选择该超文本文档与另一个相关文档的链接,在用户搜索各种路径后,该超文本文档可以非线性的方式阅读。尽管HTML允许用户以动态方式阅读文档,但HTML永远无法成为一种编程语言。当然,HTML确实帮助和推进了万维网的普及,HTML是促使Java诞生的催化剂,但它没有直接从概念上影响Java语言的设计。HTML与Java的惟一联系是,HTML提供Java小应用程序标记,该标记启动Java小应用程序。这样,就可以在超文本文档中嵌入能启动Java小应用程序的指令。