━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
译者序
《java编程思想》已๐经成为ฦ了广大java程序员和爱好者们手中必备的宝典,它在广大
读者心目中的地位已经无可替代。其作者uceeckel也已经成为了众多java程序员顶礼
膜拜的大师。随着java技术的展以及对jaທvaທ认识的不断深入,uceecນkel推出了《jaທva
编程思想》第三版,在这里我们应该向他致敬,他不断精益求精、锐意进取的精神正是我们
应该努力学习的榜样。
随着软件开技术,尤其是9eb应用的开技术的展,java越来越受到เ人们的青睐,
越来越多的企业都选择使用java及其相关技术,例如j2๐ee技术来构建它们的应用系统。
但是,掌握好java语言并不是一件可以轻松完成的任务,如何真正掌握javaທ语言,从而
编写出健壮的、高效的、灵活的程序是jaທvaທ程序员们面临的重大挑战。
《java编程思想》就是一本能ม够让java程序员轻松面对这一挑战,并最终取得胜利的
经典书籍。本书深入浅出、循序渐进地把我们领ๆ入java的世界,让我们在不知不觉中就学
会了用java的思想去考虑问题、解决问题。本书不仅适合java的初学者,对于有经验的
java程序员来说,每次阅读本书也总是能ม够有新的体会,这正是本书的魅力所在。
本书的第二版由侯捷先生翻译,他已经把翻译原着这项工作做到了极致,我们在翻译过
程中ณ总是诚惶诚恐,一方面害怕曲解了原着的意思,另一方面也害怕破坏了第二版译着已经
做出的让广大中国读者认可本书的种种努力。
我们在翻译本书的过程中力求终于原着。对于本书中出现的大量的专业术语尽量遵循标
准的译法,并在有可能ม引起歧义之处着上了英文原文,以方便读者的对照理解。
全书的翻译由陈昊鹏和饶若楠合作完成,薛翔、郭嘉和方แ小丽ษ也参与了全书的翻译工ื作。
由于我们水平有限,书中出现错误与不妥之处在所难免,恳请读者批评指正。
前言
我的兄弟托德正准备从硬件工ื业转移到程序设计领域,我曾向他建议,下一次技术革命的重
点将是基因工程。
我们将使用微生物来制造食品、燃料é和塑料;这些微生物不仅能清除污染,还能让我们付出
比现有少得多的代价就能主宰整个物质世界。我曾以为ฦ,相比之下计算机革命将显得微不足
道。
后来我意识到自己้犯了科幻家常犯的错误:迷信技术的力量当然,这在科幻里司
空见惯。有经验的作家都知道,故事的重点不是技术,而在于人。基因工程将对我们的生
活造成深远的影响,但它未必就会使计算机革命或者至少是信息革命黯然失色,因为ฦ正
是计算机技术推动了基因工程的展。信息指的是人与人之间的沟通。当然,汽车、鞋子、
包括基因疗法,这些都很重要,但它们最终都只是表面现象。人类如何与世界ศ相处才是问题
的本质。这个相处的过程就是沟通。
本书恰好就是一个例子。很多人认为ฦ我很大胆、或者有点狂妄,因为我把所有资料都放在网
络上。“还有谁会购买呢?”他们这样问。如果我的性格保守谨慎一些,我就不会这么做。但
是我真的不想再用传统方式来编写一本新的计算机书籍。我不知道这么做会有什么后果,但
结果表明,这是我在写书经历中ณ做过的最明智的一件事。
先,人们开始把改正后的意见反馈给我。这是个ฐ令人惊叹的过程,因为ฦ人们仔细检查每个ฐ
角落、每个缝隙,找出技术上和语法上的种种问题,让我得以改正所有错误,而这些错误单
凭我个人是很难觉察到的。人们对这种作法还有些顾虑,他们常常说“我并无冒犯之意…”,
然后扔给我一大堆错误。无疑我自己้从未察觉过这些错误。我很喜欢这种集体参与的过程,
这也使这本书更加特别。这些反馈很有价值,所以我使用称为ฦ“bacນktalk”的系统创建了一
些应用,来对这些建议进行收集和分类。
但是,很快我就开始听到“嗯,很好。把书做成电子版放到网络上是个好主ว意,可是我希望
购买印刷出版并装订成册的书籍”。我曾经作出努力,让每个人都能很容易地打印出美观的
书籍,但这样仍然无法满足人们对印刷书籍的需求。大多数人都不习惯在计算机屏幕上阅读
整本书,也不喜欢总是带着一捆捆的纸,所以即使这些打印出来的书籍再美观,也吸引不了
他们而且激光打印机的碳粉并不便宜。看来即使是计算机革命,也难以抢走出版商的生
意。不过,有个学生提出这也许会在未来成为一种出版模式:先在网络上出版书籍,当它引
起足够的关注以后,才考虑制ๆ作纸质版本。目前,绝大多数书籍都不赚钱,这种新方式或许
可以给整个出版业带来更多的利ำ润。
在另一方面,这本书也带给我一些启迪。开始,我认为java“只不过是另一种程序设计语言”。
从许多方面看的确如此。但随着时间流逝,以及对java学习的深入,我才开始明白,这个
编程语言的目的,与我所见过的其它语言根本不同。
程序设计就是对复杂度的管理。它包括:待解问题的复杂度和所依赖的底层机器的复杂度。
正是因为这种复杂度的存在,导致了大多数项目的失败。并且据我所知,还没有哪个程序设
计语言全力将主ว要设计目标放在“征服程序开与维护过程中的种种复杂度”上
1
。当然,许
多编程语言设计时也确实考虑到了复杂度问题,但它总是与被视为更本质的问题混在一起。
当然,那些也都是会让程序员感到困扰的问题。比如,cນ++必须向上兼容于cນ为使cນ程序
员容易过渡,并具有执行效率高的优点。这两ä点都很有用,并且帮助cນ++取得了成功。
不过,两ä者也引入了额外的复杂度,使得某些项目无法完成。当然,你可以归咎于开或
管理人员,但如果有某种语言可以帮助我们找到错误,何乐而不为呢?visualbຘasicນvb
是另一个ฐ例子,它被局限于basic语言它并不把可扩展能力作为设计目标,这就使得
所有堆积于vb之上的扩充功能ม,都造成了可怕且难以维护的语法。perl也向上兼容于
aທ9k、色d、grep、以及其它unix工具,这就导致了被诟病为“能写不能读”的程序代码也
就是说,一段时间之后,你就无法看懂这些代码。另一方面,c++ใ、vbຘ、perl、smaທlltalk
之类的编程语言,都为复杂度问题付出了相当大的努力,在解决特定类型问题的时候非常成
功。
当我开始理解javaທ之后,印象最深的莫过在java上体现出的sun公司的设计目标:为ฦ
程序员降低复杂度。就好象说:“我们关注的是降低编写健壮代码的困难程度和需要的时间”。
以前,编写健壮代码将导致性能ม降低尽管有许多承诺,jaທva总有一天能够执行得足够快,
不过java的确大大缩短了开时间;相比同等功能ม的c++ใ程序,它只需一半甚至更少的
时间。只凭这一点,就足以省下大量的时间与金钱。不过,java并不仅仅如此。它又持续
引入了一些日益重要的复杂任务,比如多线程和网络编程。并且通过语言本身的特性和程序
库,使得这些工作变得轻而易举。最后,javaທ还着眼于某些有着极高复杂度的问题:跨平