标题：Java语言精粹
图书信息
Java语言精粹  （美）瓦尔多（Waldo,J.）著
王江平译
ISBN 978-7-121-13309-1
2011年6月出版
定    价：39.00元
16开
188页
宣传语
深入挖掘JAVA之精华
内 容 简 介
这是一本几乎只讲Java优点的书。
Jim Waldo先生是原Sun微系统公司实验室的杰出工程师，他亲历并参与了Java从技术萌生、发展到崛起的整个过程。在这本书里，Jim总结了他所认为的Java语言及其环境的诸多精良部分，包括：类型系统、异常处理、包机制、垃圾回收、Java虚拟机、Javadoc、集合、远程方法调用和并发机制。另外，他还从开发者的角度分析了在Java技术周围发展起来的“开发者生态环境”。如果要把Java技术精炼到只含有它的最佳部分，在Jim看来，以上这些就是必须保留的部分。
作者还从历史的视角阐述了Java中某些技术的发展历程，解释了某些问题之所以存在的原因，使人读后有一种“知其所以然”的通透感。阅读本书不但能使你重温Java的核心机制，还可以使你了解语言的设计者和实现者们是如何权衡、折中并维护各种不同的语言特性，从而成就了这门流行的系统级通用编程语言的。
相信不管是Java语言的学习者，还是使用Java语言构建软件系统的开发者，以及对程序设计语言感兴趣的技术爱好者，都可以从本书中汲取营养。
译 者 序
关于本书
这是一本几乎只讲Java 优点的书。作者总结了他所认为的Java 语言及其环境的诸多精良部分，包括：类型系统、异常处理、包机制、垃圾回收、Java 虚拟机、Javadoc、集合、远程方法调用和并发机制。此外，作者还从开发者的角度分析了在Java 技术周围发展起来的“开发者生态环境”。如果要把Java 技术精炼到只含有它的最佳部分，在作者看来，以上就是必须保留的部分。
作者还从历史的视角阐述了Java 中某些技术的发展历程，解释了某些问题之所以存在的原因，使人读后顿有一种“知其所以然”的通透感。通过翻译本书，在重温Java 核心机制的同时，译者还了解了语言的设计者和实现者们是如何权衡、折中并维护各种不同语言的特性，从而成就这门广受欢迎的系统级通用编程语言的。相信读者也会有同样的收获。译者认为，不管是Java 语言的学习者，还是使用Java 语言构建软件系统的开发者，以及对程序设计语言感兴趣的技术爱好者，都能从本书中汲取营养。
我为什么选择翻译这本书
说起本书的翻译，自然要提到当时在电子工业出版社博文视点工作的周筠老师。认识周老师是好多年前的事了，但真正面对面坐下来聊天不过是去年的事情。在那之后，周老师更成了我的良师，我常去翻翻她的新浪微博（@ 出版人周筠），而且常常能从中领悟不少有益的东西。有一天，看到周老师在征集新书译者，经过考虑，我很快向她表达了自己的意向，再加上周老师对我的信任，此事便得以促成。在这一过程中，还要好好谢谢当时同在博文视点的鸬东翔编辑，不是因为他让我多认识了一个汉字，而是因为他对我太多的信任和帮助。当然，翻译本书的另一个重要原因是翻看原书后对精彩内容的喜爱，这些前面已经提到了。还有一个原因：在我个人的技术知识结构中，编程语言的知识占了很大一部分，而之前翻译过的几本书大都与模式有关，更偏于“坐而论道”。其实我个人一直希望有机会翻译一本语言方面的书注1。
注1 ： 为了节省成本和便于读者阅读，我们将原书版式进行了压缩，原书页码用“ ”表示，供读者对照阅读。本书的索引（包括正文中的交叉索引）所列页码为原英文版页码。
关于勘误
翻译与阅读不同，翻译过程会注重更多的细节。译者在翻译中就发现了原文的一些小问题，对于这些小问题，译者都通过邮件得到了作者的确认，然后直接按确认后的内容翻译的，且没有提供译注。同时，译者也在O’Reilly 网站上提交了这些勘误，说到这个，也要感谢作者Jim Waldo 先生及时的回复。
致谢
除了上面提到的几位，本书在翻译和出版过程中还应感谢以下一些人。首先是本书的审校人张伸（新浪微博@loveisbug），之前我翻译《敏捷开发的艺术》和《软件开发者路线图》时，他就热心细致地帮我审校过书稿，这次作为正式的审校人，他更是细致地通读了全稿，从中发现了不少小错误，还提出了大量的改进意见。其次要感谢群硕软件开发（上海）有限公司前高级软件工程师高远（新浪微博@ 狼大人），我翻译过的所有作品都有他的帮助，这本书也不例外，他协助初译了本书第11 章的内容。祝愿如今远赴异域的他一切都好。感谢博文视点的李利健编辑，她从整体结构和行文风格方面对译稿提出了许多意见和建议。此外，还有博文视点的丁曼、张春雨、刘皎，以及许多不知道名字的为本书的出版辛勤工作的人，这本书能与读者见面，源于他们共同的努力。还有“译言网”和“译网情深”翻译论坛上的一些并不熟悉的朋友，感谢他们帮我拆解了不少疑难杂句。最后，感谢我的家人，从爷爷、奶奶、爸爸、妈妈到我的妹妹，还有许多师长亲朋，从小到大，走过的每一步都饱含着他们的鼓励、支持与期盼。
王江平
2011 年3 月 于上海浦东
前  言
这是一本关于Java 编程语言和Java 编程环境的书。作为如今最广泛使用的编程语言之一，Java 已经是许多书的主题了。当我写下这句话的时候，在Amazon 网站上搜索关于“Java编程”（Java programming）的书会得到11978 条结果。那么，为什么还要写一本呢？
写这本书出于如下考虑：Java 在经历了15 年左右的发展之后，已经变成了巨大的且相当复杂的语言和环境。自从Java 出现以来，仅语言本身就增加了大量的新东西。与语言紧密关联的库增长得更多，而向前兼容的需要意味着尽管增加的东西很多，拿掉的却很少。任何重量级的软件都是被诅咒过的，这个诅咒便是：要生存，必须变得流行；而在逐渐流行的过程中，软件不能有任何改变或打破原来依赖它的东西。如果软件可以从一开始就做得完美，这当然没有问题，但软件开发不是这样的。所有软件的进展都是一次尝试，试图把事情做正确，每一次尝试也都有或多或少的成功。即使一款软件在第一次发行时是完美的，用户也会找到使用软件的新方法（或者使用软件的环境会发生变化），从而使它不再完美。因此，我们（程序员们）都努力把软件做得更好，这意味着我们会增加东西，而这又意味着久而久之，所有的软件都会面临脏乱堆砌的命运。
本书是一次从Java（包括语言和环境）中挑选出最精良的部分，并就如何使用这部分内容以及它们为什么是精华进行讨论的尝试。但这不是说本书中没有讨论的那些部分都不好；只是说我将要讨论的这些精良部分能把Java 与其他许多语言区别开来，使得Java对我和许多软件开发者的工作都颇有价值。
Java与我
我个人与Java 相伴的历史可以追溯到1992 年3 月，当我刚加入Sun 实验室注1 的时候，注1 ： 正式的名称是“Sun 微系统实验室”（Sun Microsystems Laboratories, Inc）。实验室有一个秘密项目，项目的一部分涉及一种新的编程语言。这门当时称为Oak 的语言是C++ 语言的变种，被设计运行于嵌入式设备上，但它看起来却有成为通用编程语言的苗头。那时有许多项目在寻求其他的面向对象系统语言，当时这个家族的主导语言是C++，但C++ 已开始变得复杂，人们对这种逐渐累积起来的复杂性产生了极大的不满（而这还是在模板加入到C++ 之前）。
我看了一下Oak 语言，那时它似乎太不稳定了，因为我正在着手做分布式系统方面的工作，可它无法成为我的合适工具。如果我们在自己的工作中采用它，那又将出现一次当时实验室里称为“33 号错误”的典型，这个错误是指一个研究项目的成功基于另一个研究项目（而且迄今尚未完成的项目）的成功。把语言文档归置好，我的项目组继续进行我们在Modula-3 注2 方面的研究。
那是18 个月后在一次称为“语言日”的内部审查活动中，我见到了Java，那时Oak 语
言是那个更早的、更大的嵌入式项目中唯一存活下来的部分，项目组也搬进了Sun 实验室，
并把这里作为它的组织家园。Sun 实验室的主任Burt Sutherland 意识到在他的小实验室
中至少有四种语言项目在进行，因此组织了一个语言日，让每个项目都可以在这一天展
示一下。他希望给每个项目一些展现的机会，或许还希望促进跨项目的横向交流、学习
和整合。作为另一个使用第五种语言的项目主管，我也被邀请参加。
我并不确知“语言日”的官方结果是什么，但它确实让我对Oak 刮目相看了，比起我上次见到时，它已经在成熟度和稳定性方面取得了长足进步。当时我的项目组正在寻找一种新的语言，因为我们越来越难获得来自Modula-3 团队的支持。于是我们决定把研究中使用的语言转向Oak。此时，这看起来只是“33 号错误”的一个微不足道（只是有一点冒险）的实例了。我记得自己写了一封邮件给实验室主任，表明在我的项目组中使用Oak 是可接受的，因为作为一个研究性项目组，我们完全可以使用尚不具有商业可行性的语言。
几个月之后，Oak 就成了Java，以小应用程序（applet）的形式首次出现在了浏览器中，而Java 作为一种语言和环境便爆发了。我成了一个负责描绘语言发展道路的公司级团队（由Bill Joy 领导）中的一员。他们也要求我参加另一个对语言进行初次正规审查的项目组，这次审查导致了一些语言基础设计方面的改变。
很难忘记那些日子，Java 从一种晦涩的编程语言一夜之间成了奇迹。对那些知晓Java 语言的一切，或只想参与这份激动的人来说，它成就了一段同舟共济的经历。那也正是万维网（World Wide Web）获得几何级增长的日子，而Web 的成长和Java 的成长在某种注2 ： Modula-3 是20 世纪80 年代末由DEC 和Olivetti 两家公司开发的一种编程语言，派生自Modula-2。——译者注程度上似乎交织在一起了。Java 语言的发展成了全国性的新闻，在我的记忆里，那是空前绝后的。
我的项目组很快被调离了Sun 实验室，成为Java 软件组织东海岸分部的核心，致力于Java 语言的一些分布式库的开发。在过去15 年中，我在Sun 公司的各个部门之间四处游荡（如今又回到了开始的地方：Sun 实验室），使用的主要语言却从未改变。我参与了关于将哪些内容添加到语言和库中的内部讨论，见证了JCP（Java Community Process，Java 社区进程）的形成，看到了整个平台被划分成企业版、标准版和微型版。我在JavaOne 大会所发表的演讲比参加所有的JavaOne 大会次数都多，在日本、意大利和英国举行的Java 技术大会上，我也曾发表过演讲。
我曾花费了大量的时间思考：是什么让Java 成为工作中能获得乐趣的语言和环境？又有语言的哪些部分会妨碍这种乐趣？我曾经为包含或排除某些特性而争辩，有的成功了，有的失败了。我也曾编写了相当数量的代码，阅读的代码量更多，通常都是由对Java 语言的表达力运用比我更好的工程师编写的。Java 并非我所使用的唯一语言，但当我转向其他语言，然后再返回来使用Java 时，感觉就像回家一样——我总会感觉舒服，即使有一些需要转变的习惯和需要避开的话题。
本书的读者
本书并不打算向读者讲授Java。本书的读者要求已熟悉Java 语言的语法和面向对象程序设计的基本概念。对于构成语言一部分的Java 库，也要求读者拥有相关的背景知识。本书的目的不是为读者讲授全新的内容，而是让读者回忆自己已经知道但可能忘却了的内容，或者让读者从新的视角重新看待自己曾经思考过的内容。对那些刚刚起步的Java 新手，希望本书能向你展示一些应该首先学习的特性。你所认为的语言的精良部分可能与笔者不同，也可能你觉得笔者所喜欢的某种东西恰是使语言糟糕的特性。但如果本书能使你思考语言中哪些是好的，哪些不是那么好的，那它就达到了目的。
本书采用的约定
本书在印刷上采用如下约定：
y 斜体（Italic）：表示新的术语、URL、电子邮件地址、文件名和文件扩展名。
y 等宽字体（Constant width）：用于程序代码，以及段落中引用的程序元素，如变
量或函数名、数据库、数据类型、环境变量、语句和关键字。
iv | 前言
y 等宽粗体（Constant width bold）：显示命令，或其他应由用户逐字输入的文本。
y 等宽斜体（Constant width italic）：显示应该由用户提供的或由上下文决定的数据来取代的部分。
使用代码示例
本书的目的是帮助你完成工作。基本上，你可以将书中的代码用于你的程序或文档中。除非你直接复制大段代码，否则无须联系我们并获得许可。举例来说，在程序中使用书中的几段代码无须许可。然而，出售或发布含有O’Reilly 书中示例的CD-ROM 需经许可。
引用本书中的叙述或示例代码来回答问题也无须许可。但将书中的大量代码合并到你的
产品文档中则需获得许可。
虽然我们不要求在引用本书时做版权归属声明，但如果你这样做，我们会非常感激。版权归属声明通常包含标题、作者、发行者和ISBN。例如：“《Java 语言精粹》，Jim Waldo 著，版权所有2010 Jim Waldo，978-0-596-80373-5。”
联系我们
有关本书的建议和问题，请与出版商联系：
美国：
O’Reilly Media, Inc.
1005 Gravenstein Highway North
Sebastopol, CA 95472
中国：
北京市西城区西直门南大街2 号成铭大厦C 座807 室（100035）
奥莱利技术咨询（北京）有限公司
我们将为本书提供主页，在其中提供勘误表、示例及其他附加信息。如果读者想了解关于我们的图书、会议、资源中心以及O’Reilly Network 更多的信息，
Safari®在线图书
“Safari 在线图书”是一座按需服务的数字图书馆，允许读者方便地搜索
7500 多套技术或艺术参考书和视频，从而快速找到所需要的答案。
读者只要订阅，就可以从我们的在线图书馆中阅读所有的页面，观看所有的视频，在手
机和移动设备上读书，在付梓之前便看到新的主题，看到正在写作中的手稿，向作者发
反馈，复制和粘贴代码示例，管理收藏夹，下载章节，标记关键章节，做笔记，打印页面，
并从其他许多节省时间的特性中受益。
O’Reilly Media 已将本书（英文版）上传至Safari 在线图书服务中。要获取本书以及来
自O’Reilly 和其他出版商类似主题书籍的完整数字版。
致谢
过去15 年的Java 开发经历给笔者带来的最美好的体验之一就是接触到的那一系列人物。James Gosling 注3 创建了一种美丽的语言，并吸引了一大群工程师、管理者、市场人员及其他各种不同职位的人。他们当中有很多才华横溢的人，也有的略逊一畴，但都是很有趣的人。有英雄，也有混球，有罪人，也有圣徒，还有介于他们之间的一些人。有一些成了好朋友，其他的成了强劲对手，但他们都为这一语言、环境，以及整个发展的历程做出了贡献。
注3 ： James Gosling 是Java 语言之父。——译者注
从他们当中挑选出任何一位或多位在笔者记忆中特别重要的人来致谢都是不公的，也是不完整的。尽管如此，我还是要提及一些，我印象最深、感情最真的都是那些在工作中亲密接触过的人，包括John McClain、Peter Jones 和Ann Wollrath。没有他们，笔者对Java 的理解将和现在完全不同。
我也必须感谢我的妻子Susan Mitchell，感谢她的支持与宽容，她的鼓励和支持（并在我可能不工作的时候允许我消失一大段时间）使得本书的出版成为可能。
任何一个像本书这种规模的项目都需要一位啦啦队长、责骂者和共鸣板；Mike Loukides是O’Reilly 负责本书的编辑，充当了所有的这些角色，而且不止这些。在此还要感谢笔者的技术审校，他挑出了许多问题，倘若笔者不加更正而直接付梓，结果会很糟。
最后，我想以本书作为纪念献给Sun 微系统公司，那是Java 最初开发出来的地方。在Java（和其他许多东西）的发展历程中，尽管公司已经尽了最大的努力，但目标是什么，已经发生了什么，这些从来都没有完全清晰过。不过结局还是很壮观，真是一次苦旅，我已经在怀念它了。
目  录
第1章 Java简介 1
Java好在哪里 2
第2章 类型系统 7
类型系统概述 7
为何有三种 9
内在和外表 15
使用须知 16
真实问题 18
第3章 异常 21
导常概述 21
设计理念 25
工作原理 26
使用和滥用 30
异常的另一面 33
第4章 包 37
包概述 37
包和访问控制 40
一个例子 41
包和文件系统 44
第5章 垃圾回收 47
垃圾回收概述 47
垃圾回收和引用 49
内存泄露 50
其他资源 53
第6章 Java虚拟机 61
Java虚拟机概述 61
安全性 63
可移植性 64
可移植陷阱 66
第7章 Javadoc 73
Javadoc概述 73
一个例子 75
实现文档 80
包文档 81
有关文档注释风格、编辑器的争论 83
第8章 集合 85
集合概述 85
参数化类型 92
高级话题 98
随机访问 108
结束语 112
第9章 远程方法调用和对象序列化 115
概述 116
对象序列化 127
RPC系统中的子类型 132
第10章 并发 137
并发概述 139
同步 144
原子数据 150
第11章 开发者生态环境 153
IDE 154
JUnit 156
FindBugs 160
其他工具 161
索引 163