[color=blue]简介
“上帝赋予人类说话的能力,而说话又创造了人类对宇宙的量度——思想”—Prometheus Unbound, Shelley
人类极其受那些已经成为用来表达他们所处社会的媒介的特定语言的支配。想象一下,如果一个人可以不使用语言就能够从本质上适应现实世界,语言仅仅是为了解决具体的交流和反映问题时偶尔被使用到的方式,那么我们会发现这只能是一种幻想。事实上“真实世界”在很大程度上是不知不觉地创建于群体的语言习惯之上的。
摘自“The Status of Linguistics As A Science”,1929, Edward Sapir。
如同任何人类语言一样,Java提供了一种表达概念的方式。如果使用得当,随着问题变得更庞大更复杂,这种表达媒介将会比别的可供选择的语言要更为简单更为灵活。
我们不应该将Java仅仅看作是一些特性的集合——有一些特性在孤立状态下没有任何意义。如果我们需要考虑设计,而不仅仅只是编码,那么我们可以将Java的各部分作为一个整体来使用。而且如果要按照这种方式去理解Java,我们通常必须理解有关它的问题以及在程序设计时伴随的问题。这本书讨论的是编程问题、它们为什么成为问题,以及Java已经采取的用于解决它们的方案。因此,我在每章所阐述的特性集都是基于我所看到的这一语言在解决特定类型问题时的方式。按照这种方式,我希望能够每次引导你向前前进一点,直到Java思想意识成为你自然不过的语言。
自始至终,我一直持这样的观点:你需要在头脑中创建一个模型,用于加强对这种语言的深入理解;如果你遇到了疑问,你就能够将它反馈给你的模型并推断出答案。
前提条件
本书假定你对程序设计具有一定程度的熟悉:你已经知道程序是一些语句的集合,知道子程序/函数/宏的思想,知道像“if”这样的控制语句和像“while”这样的循环结构,等等。不过,你可能在许多地方已经学到过这些,例如使用宏语言进行程序设计或者使用像Perl这样的工具工作。只要你的程序设计已经到达能够自如地运用程序设计基本思想的程度,你就能够顺利阅读本书。当然,本书对C程序员来说更容易,对于C++程序员更是如此,因此,即使你没有实践过这两种语言,也不要否定自己——而应该乐于努力学习(并且,伴随本书的多媒体光盘能够带领你快速学习所必需的java基础知识)。不过,我还是会介绍面向对象(OOP)的概念和Java的基本控制机制的。
尽管经常引用参考C和C++语言的特性,但这并不是打算让它们成为内部注释,而是要帮助所有的程序员正确看待这些语言,毕竟Java是从这些语言衍生而来的。我将会努力简化这些引用参考,并且解释我认为一个非C/C++程序员可能不太熟悉的任何事情。
学习Java
大概在我的第一本书《Using C++》(Osborne/McGraw-Hill于1989年出版)出版发行的同一时候,我就开始教授这种语言了。讲授程序设计语言已经成为我的职业了;自1987年以来,我在世界各地的听众中看到有的混混欲睡、有的面无表情、有的表情迷茫。当我开始给较小的团体进行室内培训时,在这些实践期间我发现了一些事情。即使那些面带微笑频频点头的人也困惑于对很多问题。我发现,多年来在软件开发会议上由我主持的C++分组讨论会(后来变成Java分组讨论会)中,我和其他的演讲者往往是在极短的时间内告诉听众许多的话题。因此,最后由于听众的水平不同和讲授教材的方式这两方面原因,我可能最终流失了一部分听众。可能这样要求得太多了,但因为我是传统演讲的反对者之一(而且对于大多数人来说,我相信这种抵制是因为厌倦),因此我想尽力让每个人都可以跟得上演讲的进度。
我曾经一度在相当短的时间内做了一系列不同的演讲。因此,我结束了实践和迭代(一项在Java程序设计中也能很好运行的技术)的学习。最后,我使用自己在教学实践中学到的所有东西发展出一门课程。它以离散的、易消化的步骤以及参与讨论班的形式(最理想的学习形式)解决学习问题,并且每一小节课之后都有一些练习。我公司MindView, Inc现在提供公开的和内部的Thinking in Java培训课程;这是我们主要的介绍性培训课程,为以后更高级的培训课程提供基础。你可以到网站www.MindView.net上详细了解。(培训课程的介绍也可以在附带的Java多媒体光盘中得到。在同样的网站上也可以得到这些消息。)
从每个讨论班获得的反馈信息都可以帮助我去修改和重信制订课程教材,直到我认为它能够成为一个良性运转的教学工具为止。不过这本书并不能当作一般的培训课程笔记;我试着在这些书页中放入尽可能多的信息,并且将它构造成能够引导你顺利进入下一课题的结构。最重要的是,这本书是为那些正深入一门新的程序设计语言的单个读者而服务的。
目标
就像我前一本书《Thinking in C++》那样,这本书是围绕着程序设计语言的教学过程而构建的。特别地,我的目的是要建立一套机制,提供一种在自己课程培训班中进行程序语言教学的方式。当我思索书中的一章时,我思索的是如何在培训班上教好一堂课。我的目标是,切割出可以在合理学时内讲完的篇章,随后是适合在课堂上完成的练习作业。
在这本书中我想达到的目标是:
1.每一次只演示一个简单步骤的材料,以便你在继续后面的学习之前可以很容易地消化吸收每一个概念。
2.使用的示例尽可能的简单、简略。这样做有时会妨碍我们解决“真实世界”的问题,但是,我发现对于初学者,通常能够理解例子的每一个细节,而不是理解它所能够解决的问题范畴会为他们带来更多的愉悦。同样,对于在教室内吸引读者学习的代码数量也有严格限制。正因为这些因素,我将毫无疑问地会遭到使用“玩具般的示例”的批评,但是我乐意接受那些有利于为教育带来益处的种种事物。
3.谨慎安排呈现特性的先后顺序,以便使你在看到使用某一主题之前已经接触过它。当然,不可能总是这样;在这种情况下,将会给出简洁的介绍性描述。
4.向你提供那些我认为对理解这种程序设计语言来说是很重要的部分,而不是提供我所知道的任何事情。我相信存在一个信息重要性的层次结构,有一些事实对于95%程序员来说永远不必知道——那些只会困扰人们并且凭添他们对程序复杂性感触的细节。举一个C语言的例子,如果你能够记住操作符优先表(我从未能记住),那么你可以写出灵巧的代码。但是你需要再想一想,这样做会给读者/维护者带来困惑。因此忘掉优先权,在不是很清楚的时候使用圆括号就行了。
5.使每部分的重点足够明确,以便缩短教学时间和练习时段之间的时间。这样做不仅使听众在参与讨论班时的思维更为活跃和集中,而且还可以让读者更具有成就感。
6.给你提供坚实的基础,使你能够充分理解问题,以便转入更困难的课程和书籍中。
JDK的HTML文档
来自于Sun Microsystems公司的Java语言及其类库(可以从java.sun.com免费下载),配套提供了电子版文档,可使用Web浏览器阅读。并且实际上,每个厂商开发的Java编译器都有这份文档或一套等价的文档系统。大部分出版的Java书籍也都有这份文档的备份。所以你或者可能已经拥有了它,或者需要下载;所以除非需要,本书不会再重复那份文档。因为一般来说,你用Web浏览器查找类的描述比你在书中查找要快得多(并且在线文档更可能保持更新)。你仅需要参考“JDK文档”。只有当需要对文档进行补充,以便你能够理解特定实例时,本书才会提供有关类的一些附加说明。
章节
本书设计时在思想中贯穿了一件事:人们学习Java语言的方式。讨论班听众的反馈帮助我了解哪些困难部分需要解释清楚。对于这个领域,在我突然雄心勃勃并且想涵盖如此多的特性之处,我渐渐明白——贯穿讲述材料的过程中——如果涉及到许多新特性,你就需要对它们全部解释清楚,不然这会很容易使学生感到困惑。因此,每次我就费尽大量心思介绍尽可能少的特性。
因此,本书的目标是每一章只讲述一个单一特性,或者是一小组相关特性,而不必依赖于其他还没有讲述过的特性。这样一来你在进入下一特性之前就可以消化当前知识背景中的每个部分。
下面是对本书所含章节的简单描述,它们与我在Thinking in Java讨论班上的授课和练习时段相对应的。
第1章:对象引论
(相应的讲座在光盘上)。这一章是对面向对象的程序设计(OOP)的一个综述,包括对“什么是对象”这种基本问题的回答,接口与实现、抽象与封装、消息与函数、继承与组合以及非常重要的多态概念。你也可以概要了解对象生成的问题,例如构造器,对象存在于什么地方,一旦创建好放在什么地方,以及神奇的垃圾回收器(清除那些不再需要的对象)。还会介绍其他一些问题,包括异常的错误处理,响应用户接口的多线程以及网络和Internet。你将会知道是什么使Java如此特别以及它为什么如此成功。
第2章:一切都是对象
(相应的讲座在光盘上)。本章将引导你编写自己的第一个Java程序。本章开始先综述一些基本要素:对象引用的概念;基本数据类型和数组的简介;对象的生存空间以及垃圾回收器清除对象的方式;怎样将Java中的所有东西归为一种新的数据类型(类);创建自己类的基本要素;方法、参数以及返回值;名字可见性以及从其他类库使用组件;static关键字;以及注释和内嵌文档。
第3章:控制程序流
(相应的一组讲座在Thinking in C的光盘上)。本章以讲述Java引自C / C++的所有运算符为开始。另外,你会看到运算符的共同缺点、转型、类型升级以及优先权。接着介绍基本的控制流程图以及选择操作,这实际上是任何程序设计语言都具有的特性:if-else选择结构,for 和while循环结构,用break和continue退出循环以及Java的标注式break和标注式continue(这说明在Java中没有“goto”),以及switch分支选择。尽管材料大部分具有C 和C++代码的相同思路,但还是存在一些不同之处。
第4章:初始化和清除
(相应的讲座在光盘上)。本章首先介绍构造器,它用来确保正确的初始化。构造器的定义还涉及方法重载的概念(因为你可能同时需要几个构造器)。随后讨论的是清除过程,它并非总是如想象般的那么简单。通常地,当你不再使用一个对象时,可以不必管它,垃圾回收器会最终跟随介入,释放对象占据的内存。这部分详细探讨了垃圾回收器以及它的一些特性。本章最后将更近地观察初始化过程:自动成员初始化、指定成员初始化、初始化的顺序、static(静态)初始化以及数组初始化等等。
第5章:隐藏实现细节
(相应的讲座在光盘上)。本章探讨程序代码被封装到一起的方式,以及为什么类库的某些部分是暴露的,而有一部分则处于隐藏状态。首先要讨论的是package和import关键字,它们执行文件级别上的封装操作,并允许你构造类库。然后探讨目录路径和文件名的问题。本章最后部分讨论public, private以及protected关键字、包内访问的概念以及在不同场合下使用不同访问控制级别的意义。
第6章:复用类
(相应的讲座在光盘上)。复用类的最简单方法是通过组合(composition)将对象嵌入到你的新类中。不过,组合不是从已有的类产生新类的唯一方式。继承这个概念几乎是所有
OOP语言的标准。它是对已有的类加以利用,并为其添加新功能的一种方式(也可以是修改它,这是第7章的主题)。继承常常用于代码的复用,它通过保留相同的“基类”,并且只是将这儿或那儿的东西补缀起来以产生你所期望的类型。在这一章中,大家将学习在Java中组合和继承是怎样重用代码的,以及具体如何运用它们。
第7章:多态
(相应的讲座在光盘上)。如果靠你自己,你可能要花上9个月的时间才能发现和理解多态,这是OOP的基础。通过一些小的、简单的例子,你将会看到如何用继承来创建一族类型,并通过它们共有的基类对该族类型中的对象进行操作。Java的多态可以让你同等地对待同一族中的所有对象,这意味着你编写的大部分代码不必依赖特定的类型信息。这使你的代码更具灵活性,因此,程序的构建和源代码的维护可以变得更为简单,花费也更少。
第8章:接口和内部类
Java提供了专门的工具来建立设计和重用关系:接口,它是对象接口的纯粹抽象。Interface不仅仅只是达到极致的抽象类,由于它允许你通过创建某个可以向上转型到多个基类的类,因此它也实现了类似于C++“多重继承”的变体。
首先,内部类看起来似乎是一种简单的程序代码隐藏机制;你只需将类放置到其他类中。不过,你将会获悉内部类不仅仅只是这些;它可以知晓外围类并能与之通信。你用内部类编写的这种代码更优雅、更清晰。不过,它是一个全新的概念,需要花费一些时间才能习惯于用内部类进行设计。
第9章:异常与错误处理
Java的基本设计哲学是结构不佳的代码将不能运行。编译器会尽可能地去捕获问题,但有时某一问题——或者是程序员错误,或者作为正常执行程序一部分的情形下自然发生的错误——只能在运行时被监测到和被处理。Java具有异常处理机制用来处理在程序运行时产生的任何问题。本章将解释try、catch、throw、throws以及finally等关键字在Java中是怎样运行的,什么时刻你应当“抛”出异常,以及在捕获到它们时应该做些什么。另外,你还会看到Java的标准异常,如何创建自己的异常,在构造器中异常会发生什么,以及如何在异常期间发现异常句柄。
第10章:类型检查
当你仅持有一个对某对象基类的引用时,Java运行时类型识别(RTTI)能让你找出这一对象的确切类型。通常地,你会需要有意识地忽略对象的确切类型,以便让Java的动态绑定机制(多态)能够为那一类型实现恰当的行为。但有时候,当你仅有对某一对象的基类引用时,能够知道该对象的确切类型则会很有帮助。通常这些信息可以让你更有效地执行某些特殊情况下的操作。本章还将介绍Java的反射(reflection)机制。你将会知道RTTI 和反射是什么,它们是如何使用的,以及当不再需要RTTI时,如何避免使用。
第11章:对象的集合
一个程序如果只拥有固定数量的对象,并且这些对象的存在时间已知,那么这个程序只会是一个非常简单的程序。但是通常情况下,你的程序总会在不同的时刻创建出一些新的对象,而这些时刻只有在程序运行时才可以知道。此外,除非进入运行期,否则你无法知道所需要的对象数量,以及它们的确切类型。为了解决这个常见的程序设计问题,我们需要在任何时间、任何地点创建任何数量的对象。本章深入地探讨Java所提供的集合库:从简单的数组到复杂的容器(数据结构),如Vector和Hashtable,以便你在使用它们时可以持有自己所需的一些对象。
第12章:Java I/O系统
理论上,你可以将任何程序都分成三部分:输入、处理和输出。这意味着I/O(输入/输出)是程序非常重要的一部分。在这一章,你将学到Java所提供的各种I/O类,用于读写文件、内存块以及控制台等。Java I/O 的演变以及JDK 1.4 的新I/O (nio) 也会给予阐明。此外,本节还展示了如何获取一个对象、如何对其进行“流化”操作(使对象可以写入磁盘或通过网络传送)以及如何将其重新构造, Java的对象序列化将会为你实现这一切。另外,还将讨论Java的压缩库,用于Java归档文件格式(JAR)。最后,阐述新的优化应用程序接口(API)和正则表达式。
第13章:并发
Java提供了一套内置机制,用以支持多个被称为“线程”的并发子任务。这些线程均在单一的程序内运行。(除非你的机器里安装了多个处理器,否则这将是多子任务的唯一形式)尽管任何地方都可以应用线程,但它大多是被应用于打算创建一个反应灵敏的用户界面的情况,举例来说,虽然有一些别的任务正在执行,但用户仍然可以毫无阻碍地按下按钮或者输入数据。本章会让你在并行程序设计原则中打下坚实的基础。
第14章:创建窗口和Applet程序
Java配套提供了Swing GUI 类库,它是一系列类的集合,能以一种轻便的形式处理窗口。窗口化程序既可以是万维网applet也可以是独立的应用程序。本章将介绍用Swing来创建程序。还展示了Applet签名和 Java Web Start。同时还将介绍重要的“Java Beans”技术,它是创建“快速应用软件开发”(RAD)工具的基础。
第15章:问题发现
程序设计语言检测机制只能让你尽量开发出正确运行的程序。本章介绍一些工具用于解决编译器不能解决的问题。其中向前迈出的最大一步是自动单元测试的合并。对于本书,开发了一个自定义的测试系统确保程序输出的正确性,而且还介绍了一个实际中的标准——JUnit测试系统。开放源码的工具Ant实现了自动构建;并且对于团队开发,阐述说明了CVS的基本要素。对于运行时的问题报送,本章介绍了Java断言机制(这里演示使用的是Design by Contract)、日志记录API、调试器、剖析器、以及doclets(这些用于帮助发现源代码中的问题)。
第16章: 分析和设计
面向对象的模式是一种用于程序设计的崭新的不同以往的思想方式,而且很多人在开始学习怎样开发OOP项目时都会遇到问题。一旦你理解了对象这个概念,而且随着你学会按照面向对象的方式更深入地思考,你就能够开始创建“好的”设计以充分利用OOP提供的好处。本章介绍了分析和设计的思想,以及一些解决问题的方法,用于在合理时间内开发出好的面向对象程序。本章的主题包括:UML图及相关方法、用例、类—职责—合作(CRC)卡片、迭代开发、极限编程(XP)、开发和发展可重用的代码的方式,以及用于向面向对象程序设计过渡(转化)的策略。
附录A:对象的传递和返回
尽管在Java中我们和对象会话的唯一方式是通过引用,但是将对象传递给方法以及将对象从方法返回的概念还是会有一些有趣的结果。此附录说明当你正进入和离开方法时你需要知道哪些是用来操纵对象的,并且还演示了String类的做法,它使用的是另外一种解决问题的方法。
附录B:Java编程指南
这个附录收集了一些我这几年发现和收集到的建议,当你进行低层的程序设计和编写代码时,能够帮助引导你。
附录C:补充
以下是一些从MindView处可得到的附加学习材料的说明:
1.书后面的光盘,包含Foundations for Java,seminar-on-CD,为你学习这本书做好了准备。
2.Hands-On Java光盘的第3版本,可以从www.MindView.net网站上获取。它是基于本书资料的一张seminar-on-CD。
3.Think in Java Seminar。MindView公司——一个主要的基于本书资料的介绍性研讨会。其日程安排和注册页面请参见www.MindView.net。
4.Thinking in Enterprise Java,一本介绍了更先进的Java主题的书,适用于企业版程序设计。可以从www.MindView.net网站上获得。
5.J2EE Seminar,向你介绍真实世界Web使能的以及Java的分布式应用这些实际开发。见www.MindView.net。
6.对象设计及系统研讨会。面向对象的分析、设计及技术实现。见www.MindView.net。
7.Thinking in Patterns(Java版),介绍一些更先进的、关于设计模式和问题解决技术的Java主题。可在www.MindView.net网站上获得。
8.Thinking in Patterns Seminar。一个基于上述书籍的充满活力的研讨会。日程安排和注册页面可见www.MindView.net。
9.Design Consulting and Reviews。协助你的项目处于良好的状态。
附录D:资源
列出我发现特别有用的一系列Java书籍。
练习
在培训班上,我发现一些极其简单的例子对学生的完全理解很是有用,因此在每一章的最后你都会看到一些习题集。
大多数练习设计得都很简单,可以让学生在课堂上在合理的时间内完成这些作业,以便指导老师在查看时,可以确保所有的学生都吸收了教材的内容。有一些题目具有挑战性,但并没有难度很高的题目。(我想,你应该自己找出这些题目——或者更可能的是它们会自动找上门来)。
一些经过挑选的练习答案可以在The Thinking in Java Annotated Solution Guide的电子文档中找到,或者仅需少许费用便可以从www.BruceEckel.com下载得到。
CD-ROM
本书后面配套提供的还有一张光盘。过去我一直反对将光盘附在书的后面,因为我感觉支付了一些额外费用去获取大容量CD上的几千字节的源代码不太明智,相反更喜欢让人们到我的网站上下载这些东西。不过,你将会发现这张CD还有一些不同之处。
这张CD不包含本书的源代码,而是提供了到www.MindView.net网站上的一个超链接(你并不需要链接CD上的地址以获取代码,只要直接到那个网站去找寻即可)。这样做的原因是:在CD送往打印时,源代码还不完整,并且这种方式可以使代码在出现问题的任何时候都能及时得到完善和修正。
因为本书的三个版本之间有非常显著的变化,所以这张CD包含了HTML格式的本书的第一版和第二版,包括因前述理由而在较新的版本中被移除的,但是可能在某些情况下对你还是有用的章节。另外,你可以从www.MindView.net下载本书的当前(第三版)的HTML版本,而且它还包含了被发现并被订正了的修订。HTML版本的一个好处是它的索引是超链接的,所以对它的内容进行导航要简单得多。
不过400+兆字节的CD大部分是一个完整的被称为Foundations for Java的多媒体教程。它包括了Thinking in C培训班讲座,介绍了一些Java所沿用的C语言的语法、操作及函数。此外,还包括源自我所开创并讲授的Hands-On Java seminar-on-CD第二版的前七章的演讲内容。尽管完整的Hands-On Java CD曾经只单独出售(第3版本的Hands-On Java CD也是这样,你到 www.MindView.net网站上可以获得),我之所以决定仅包含第二版的前七章是因为它们和该书的第三版相比没有太大变化,因此它不仅可以向你提供这本书的基础,而且我还希望它还能让你感受到Hands-On Java CD(第3版)的质量和价值。
我原本打算让Chuck Allison把作为seminar-on-CD ROM一部分的Thinking in C创建成一个单独产品,不过我还是决定将它和第二版本的Thinking in C++和Thinking in Java包含在一起,这样做是为了让参加培训班的、没有太多C语言基本语法背景的人们具有连贯一致的体验。应该抛开这种思想“我是一个聪明的程序员,我不想学习C,而想学习C++或Java,因此我会跳过C直接到C++/Java。”在到了培训班以后,这些人渐渐明白对
C语言语法很好的理解这个先决条件很有必要。通过本书配套提供的光盘,我们相信每个参加培训班的人都能够事先做好充分准备。
这张CD也让这本书获得了更多的读者。即使书中第三章(程序控制流)没有介绍Java继承自C的基本部分,但是这张CD却进行了很好的介绍,而且它要求的学生应该具备的程序设计背景比这本书要求的还要少。并且通过Hands-On Java CD第二版中相应的讲稿来贯通前七章的资料,应该可以帮助你在进入Java的学习之前打下更加扎实的基础。这张CD也期望更多的人能够加入Java程序设计的大军。只有在网站www.BruceEckel.com上直接订购后才能获得Hands-On Java CD ROM第三版本。
源代码
本书的所有源代码都可以以保留版权的免费软件的形式得到,它们是以一个单一包的形式发布的,访问www.BruceEckel.com网站便可获取。为了确保你获得的是最新版本,这个发布这些源代码和本书电子版的网站是一个官方网站。你也可以在其他站点上找到这本电子书籍和这些代码的镜像版本(有一些站点已经在www.BruceEckel.com列出),不过你应该检查这个官方网站以确保镜像版本确实是最新的版本。你可以在课堂或其他的教育场所发布这些代码。
保留版权的主要目的是为了确保源代码能够被正确地引用,并且防止在未经许可的情况下,在打印媒体中重新发布这些代码。(只要说明是引用了这些代码,那么在大多数媒介中使用本书中的示例通常不是问题。)
在每个源码文件中,都可以发现下述版本声明文字:
This computer source code is Copyright ©2003 MindView, Inc.All Rights Reserved.
Permission to use, copy, modify, and distribute this computer source code (Source Code) and its documentation without fee and without a written agreement for the purposes set forth below is hereby granted, provided that the above copyright notice, this paragraph and the following five numbered paragraphs appear in all copies.
1. Permission is granted to compile the Source Code and to include the compiled code, in executable format only, in personal and commercial software programs.
2. Permission is granted to use the Source Code without modification in classroom situations, including in presentation materials, provided that the book "Thinking in Java" is cited as the origin.
3. Permission to incorporate the Source Code into printed
media may be obtained by contacting
MindView, Inc. 5343 Valle Vista La Mesa, California 91941
Wayne@MindView.net
4. The Source Code and documentation are copyrighted by MindView, Inc. The Source code is provided without express or implied warranty of any kind, including any implied warranty of merchantability, fitness for a particular purpose or non-infringement. MindView, Inc. does not warrant that the operation of any program that includes the Source Code will be uninterrupted or error- free. MindView, Inc. makes no representation about the suitability of the Source Code or of any software that includes the Source Code for any purpose. The entire risk as to the quality and performance of any program that includes the Source code is with the user of the Source Code. The user understands that the Source Code was developed for research and instructional purposes and is advised not to rely
exclusively for any reason on the Source Code or any program that includes the Source Code. Should the Source Code or any resulting software prove defective, the user assumes the cost of all necessary servicing, repair, or correction.
5. IN NO EVENT SHALL MINDVIEW, INC., OR ITS PUBLISHER BE LIABLE TO ANY PARTY UNDER ANY LEGAL THEORY FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOST PROFITS, BUSINESS INTERRUPTION, LOSS OF BUSINESS INFORMATION, OR ANY OTHER PECUNIARY LOSS, OR FOR PERSONAL INJURIES, ARISING OUT OF THE USE OF THIS SOURCE CODE AND ITS DOCUMENTATION, OR ARISING OUT OF THE INABILITY TO USE ANY RESULTING PROGRAM, EVEN IF MINDVIEW, INC., OR ITS PUBLISHER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. MINDVIEW, INC. SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE SOURCE CODE AND DOCUMENTATION PROVIDED HEREUNDER IS ON AN "AS IS" BASIS, WITHOUT ANY ACCOMPANYING
SERVICES FROM MINDVIEW, INC., AND MINDVIEW, INC. HAS NO OBLIGATIONS TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
Please note that MindView, Inc. maintains a web site which is the sole distribution point for electronic copies of the Source Code, http://www.BruceEckel.com (and official mirror sites), where it is freely available under the terms stated above.
If you think you've found an error in the Source Code, please submit a correction using the URL marked "feedback" in the electronic version of the book, nearest the error you've found.
你可以在自己的项目中引用这些代码,也可以在课堂上引用它们(包括你的演示材料),只要保留每个源文件中出现的保留版权声明即可。
编码标准
在本书的正文中,标识符(方法、变量和类名)被设为粗体。大多数关键字也被设为粗体,但是不包括那些频繁使用的关键字,例如“class”,因为如果将它们也设为粗体会令人十分厌烦。
对于本书中的示例,我使用了一种特定的编码格式。此格式遵循Sun自己在所有代码中实际使用的格式,在它的网站上你会发现这些代码(见java.sun.com/docs/codeconv/index.html),并且似乎大多数Java开发环境都支持这种格式。如果你已经读过我的其他著作,你会注意到Sun的编码格式与我的一致——尽管这与我没有什么关系,但我还是很高兴。对代码进行格式化这个议题常常会招致几个小时的热烈争论,因此我不会试图通过自己的示例来规定正确的格式;我对我自己使用的格式有着我自己的动机。因为Java是一种自由形式的程序设计语言,所以你可以继续使用任何自己感觉舒服的格式。
本书中的程序都直接来自于编译过的文件,通过文本处理器,以文本形式呈现。因此,本书打印出的代码文件全部都能够运行,而且无编译错误。那些会引起编译错误消息的错误已经用//!标注出来了,以便可以使用自动方法来很容易地发现并测试它们。那些被发现并被报送给作者的错误将首先出现在发布的源代码中,并随后出现在本书的更新材料中(还会在网站www.BruceEckel.com上出现)。
Java版本
在判断代码行为是否正确时,我通常以Sun公司的Java实现为参考。
这本书聚焦在Java 2与JDK 1.4上,并使用它们进行测试。如果你需要学习在本书的本版本中没有讨论过的Java语言的先前版本,可以从网站www.BruceEckel.com自由下载本书的第一版和第二版,它们也被包含在本书所附的CD中。
错误
无论作者使用多少技巧去发现错误,有些错误总还是悄悄地潜藏了起来,并且经常对新读者造成困扰。
由于机敏的读者所提供的反馈对我是如此的有价值,因此我开发了名为BackTalk的几个版本的反馈系统(该系统使用几种不同的技术,得到了Bill Venners的辅助,在其他很多人的帮助下得以实现)。在本书的电子版本(可以从www.BruceEckel.com自由下载)中,文中的每个段落都有自己唯一的URL,点击它可以为该特定段落产生一封将你的意见记录到BackTalk系统的邮件。这种方式使其很容易追踪和更新修正。如果你发现了任何你确信是错误的东西,请使用BackTalk系统提交错误以及你建议的修正。对你的帮助不胜感激。
封面故事
《Thinking in Java》的封面创作灵感来自于美国的 Arts & Crafts运动,该运动始于世纪之交,并在1900 到1920年期间达到顶峰。它起源于英格兰,是对工业革命带来的机器产品和维多利亚时代高度装饰化风格的回应。Arts & Crafts强调简洁设计,而回归自然是其整个运动的核心,注重手工制造以及推崇个人手工业者,可是它并不回避使用现代工具。这和我们现今的情形有很多相似之处:世纪之交,从计算机革命的最初起源到对个人来说更精简更意味深长的事物的演变,以及对软件开发技能而不仅是生产程序代码的强调。
我以同样的眼光看待Java:尝试将程序员从操作系统的机制中解放出来,朝着“软件艺师”的方向发展。
本书的作者和封面设计者(他们自孩提时代就是朋友)从这次运动中获得灵感,并且都拥有源自那个时期的或受那个时期启发而创作的家具、台灯和其他作品。
这个封面暗示的另一主题是一个收集盒,自然学家可以用它来展示他或她保存的昆虫标本。这些昆虫被看作是对象,被放置到“盒”这个对象当中。而盒对象本身放置到“封面对象”当中,这阐释说明了面向对象程序设计中最为基本的“集合”概念。当然,程序员可能不会从中得到任何帮助,只会联想到“程序臭虫(Bug)”;这些虫子被捕获并假设在标本罐中被杀死,最后禁闭于一个展示盒中,似乎暗示Java有能力发现、显示和制服程序臭虫(事实上,这也是它最为强大的属性之一)
致谢
首先感谢和我一起授课,提供咨询和开发教学计划的这些合作者:Andrea Provaglio, Dave Bartlett, Bill Venners, Chuck Allison, Jeremy Meyer, 和 Larry O’Brien。在我转而继续去竭力为那些像我们一样的独立人群开发在一起协同工作的最佳模式的时候,你们的耐心让我感激不已。
最近,无疑是因为有了Internet,我可以和极其众多的人们一起合作,协助我一起努力,他们通常是在自己的家庭办公室(home office)中工作。过去,我可能必须为这些人们提供相当大的办公空间,不过由于现在有了网络、传真以及偶尔打打的电话,我不需要额外的开销就可以从他们的帮助中受益。在我尽力学习更好地与其他人相处的过程中,你们对我全部都很有帮助,并且我希望继续学习怎样使我的工作能够通过他人的努力变得更出色。Paula Steuer在接管我偶尔的商务实践时发挥了不可估量的价值,他使它们变得井井有条了(Paula,感谢你在我懈怠时对我的鞭笞)。Jonathan Wilcox, Esq详细审视了我公司的组织结构,推翻了每一块可能隐藏祸害的石头,并且使所有事情都条理化和合法化了,这让我们心服口服。感谢你的细心和耐心。Sharlynn Cobaugh (他发现了Paula)使自己成为声音处理的专家,是创建多媒体培训CD ROM和解决其他问题的精英成员之一。感谢你在面临难于处理的计算机问题时的坚定不移。Evan Cofsky (Evan@TheUnixMan.com)已经成为了我开发过程中的重要一员,像一只鸭子那样沉迷于Python程序设计语言(嗯,这样一种混杂的隐喻可能会产生一个臃肿的Python脚本),而且解决了多种的难题,包括将BackTalk(最终?)再构造到一个email驱动的XML数据库中。在布拉格Amaio的人们
也提出了一些方案来帮助我。Daniel Will-Harris最先受到利用Internet进行工作的启发,因此他当然是我的所有设计方案的主要人物。
对于这项工程,我采用了另一个曾在我的头脑中翻腾过一段时间的措施。2002年夏天,我在科罗拉多州的Crested Butte创建了一个实习项目,最初找到了两个实习生,而最后项目结束时有5个(有2个志愿者)。他们不仅为本书做出了贡献,而且帮助我专心致志地搞这个项目。感谢他们:JJ Badri, Ben Hindman, Mihajlo Jovanovic, Mark Welsh。Chintan Thakker能够留下并呆到第二个实习期(贯穿本书编写的最后处理过程及其他的工作),因此我必须在Mount Crested Butte租赁实习公寓,我们广招志愿者,最后招到了Mike Levin, Mike Shea, 和 Ian Phillips,他们都做出了贡献。以后我可能还要再进行其它的实习项目,请访问网站www.MindView.net查看相关消息。
感谢Doyle Street Cohousing Community(道尔街住房社区)容忍我花了两年的时间来写这本书(并且一直在容忍我所做的一切)。非常感谢Kevin和Sonda Donovan,在我编写本书第一版的夏季里,他们把位于科罗拉多州宜人的Crested Butte市里面的住处租给了我(也感谢Kevin为我在CB的住处所做的重新装修)。也感谢Crested Butte友好的居民;以及Rocky Mountain Biological Laboratory(岩石山生物实验室),让我有宾至如归的感觉。我在CB的瑜伽老师Maria 和 Brenda,在我编写第三版期间帮助我保持了健康的体魄。
当老师们来提供培训时,科罗拉多州Crested Butte的Camp4 Coffee,已经成为了标准住所,并且在培训班中间休息期间,它是我所遇到的最好最便宜的饮食场所。感谢我的密友Al Smith,是他使这里成为如此好的一个地方,成为Crested Butte培训期间一个如此有趣和愉快的场所。
感谢Moore Literary Agency的Claudette Moore,因为她无比的耐心和毅力,我才能得到我真正想要的。感谢Prentice Hall的Paul Petralia不断地为我提供我所需要的一切,而且不厌其烦地帮我把所有事情都搞定(并容忍我所有的特殊需求)。
我的前两本书在Osborne/McGraw-Hill出版时,Jeff Pepper是编辑。Jeff总是在Prentice Hall恰当的地点和恰当的时间出现,他将责任转交给Paul之前,为这些书奠定了最初的根基。感谢你,Jeff。
感谢Rolf André Klaedtke (瑞士); Martin Vlcek, Vlada & Pavel Lahoda, (布拉格);和 Marco Cantu (意大利)在我第一次自行组织的欧洲研讨会巡展中对我的热情款待。
感谢Gen Kiyooka和他的同事Digigami,他慷慨地为我前几年的网上授课提供了Web服务器。这是无价的辅助学习手段。
特别感谢Larry 和Tina O’Brien,他们帮助我把我的培训课程制作成了第一版的Hands-On Java光盘。(你可以到网站www.BruceEckel.com查看更多消息。)
在我开发期间,某些开放源码的工具已经被证明是无价的;并且每次使用它们时都会非常感激它们的创建者。Cygwin (http://www.cygwin.com)为我解决了无数Windows不能解决的问题,并且每天我都会变得更加依赖它(如果在15年前当我的头脑因为使用Gnu
Emacs而搞得发懵的时候,能有这些该多好啊)。CVS 和Ant已经成为了在我的Java开发过程必不可少的部分,现在我已经无法再返回不用它们的时代了。我现在甚至已经变得喜欢JUnit了(http://www.junit.org),因为他们实际上已经使它成为了“可以运转的最简单的事物。”IBM的 Eclipse (http://www.eclipse.org)对开发社区做出了真正杰出的贡献,并且随着它的不断升级,我期望能看到它的更伟大之处(IBM是怎样成为潮流所向的?我肯定错过了一份备忘录)。Linux在开发过程中每天都要用到,特别对实习生来说尤为如此。当然,如果我在其他地方强调得还不够的话,我得再次重申,我经常使用Python(www.Python.org)解决问题,在我的密友Guido Van Rossum和PythonLabs那些身材臃肿愚笨的天才人物的智慧结晶的基础上,我花费了好几天的时间在Zope 3上进行极限编成(XP)(Tim,我现在已经把你借的鼠标加了个框,正式命名为“TimMouse”)。你们这伙人必须到更健康的地方去吃午餐。(还要感谢整个Python社区,他们是一帮令人吃惊的人们)。
很多人向我发送修正意见,我感激所有这些人,第一版特别要感谢:Kevin Raulerson (发现无数的程序臭虫), Bob Resendes (简直难于置信), John Pinto, Joe Dante, Joe Sharp (三位都难于置信), David Combs (校正了许多语法和声明), Dr. Robert Stephenson, John Cook, Franklin Chen, Zev Griner, David Karr, Leander A. Stroschein, Steve Clark, Charles A. Lee, Austin Maher, Dennis P. Roth, Roque Oliveira, Douglas Dunn, Dejan Ristic, Neil Galarneau, David B. Malkovsky, Steve Wilkinson,以及许许多多的人。本书第一版本在欧洲发行时,Marc Meurrens在电子版宣传和制作方面都做出了巨大的努力。
感谢在第2版本中,那些使用Swing类库帮助我重新编写示例的人,以及其他助手:Jon Shvarts, Thomas Kirsch, Rahim Adatia, Rajesh Jain, Ravi Manthena, Banu Rajamani, Jens Brandt, Nitin Shivaram, Malcolm Davis,以及所有表示支持的人。
曾经有许多技术人员走进我的生活,他们后来都和我成了朋友。他们对影响了我,并对我来说他们是不寻常的,因为他们平时练习瑜伽功,以及另一些形式的精神训练,我发现这些很具有启发性和指导意义。他们是Kraig Brockschmidt,GenKiyooka和Andrea provaglio(他帮助我了解了Java和程序设计在意大利的概况,现在他在美国,是MindView团队的一员)。
对Delphi的一些理解使我更容易理解Java,这一点都不奇怪,因为它们有许多概念和语言设计决策是相通的。我的Delphi朋友提供了许多帮助,使我能够洞察一些非凡的编程环境。他们是Marco Cantu(另一个意大利人——难道会说拉丁语的人在学习Java时有得天独厚的优势?)、Neil Rubenking(直到发现喜欢计算机之前,他一直都在做瑜珈/素食/禅道),当然还有Zack Urlocker(Delphi产品经理),他是我游历世界时的好伙伴。
我的朋友Richard Hale Shaw(以及Kim)的洞察力和支持都很有帮助。Richard和我花了数月的时间将教学内容合并到一起,并为参加学习的学生设计出一套完美的学习体验。
书籍设计、封面设计以及封面照片是由我的朋友Daniel Will-Harris制作的。他是一位著名的作家和设计家(http://www.WillHarris.com),在计算机和桌面排版发明之前,他在初中的时候就常常摆弄刮擦信(rub-on letter)。他总是抱怨我的代数含糊不清。然而,要声明的是,是我自己制作的照排好的(camera-ready)页面,所以所有排字错误都应该
算到我这里。我是用Microsoft® Word XP for Windows来编写这本书的,并使用Adobe Acrobat制作照排页面的。本书是直接从Acrobat PDF文件而创建的。电子时代给我们带来了厚礼,我恰巧是在海外创作了本书第一版和第二版的最终稿——第一版是在南非的开普敦送出的,而第二版却是在布拉格寄出的。第三版则来自科罗拉多州的Crested Butte。本书中正文字体是Georgia,标题是Verdana。封面字体是ITC Rennie Mackintosh。
特别感谢我的所有老师和我的所有学生(他们也是我的老师),其中最有趣的一位写作老师是Gabrielle Rico(《Writing the Natural Way》一书的作者,Putnam于1983年出版)。我将一直珍藏对在Esalen所经历的非凡的一周的记忆。
书后面的照片是我爱人Dawn McGee照的,并且是她让我那样地笑的。
曾向我提供过支持的朋友包括(当然还不止他们):Andrew Binstock,SteveSinofsky,JD Hildebrandt,Tom Keffer,Brian McElhinney,Brinkley Barr,《Midnight Engineering》杂志社的Bill Gates,Larry Constantine和LucyLockwood,Greg Perry,Dan Putterman,Christi Westphal,Gene Wang,DaveMayer,David Intersimone,Andrea Rosenfield,Claire Sawyers,另一些意大利朋友(Laura Fallai,Corrado,Ilsa和Cristina Giustozzi),Chris和Laura Strand,Almquists,Brad Jerbic,Marilyng Cvitanic,Mabrys,Haflingers,Pollocks,Peter Vinci,Robbins Families,Moelter Families(和McMillans),Michael Wilk,Dave Stoner,Laurie Adams,Cranstons,Larry Fogg,Mike和Karen Sequeira,Gary Entsminger和Allison Brody,KevinDonovan和Sonda Eastlack,Chester和Shannon Andersen,Joe Lordi,Dave和Brenda Bartlett,David Lee,Rentschlers,Sudeks,Dick,Patty和Lee Eckel,Lynn和Todd以及他们的家人。当然还有我的爸爸和妈妈。
[/color]
“上帝赋予人类说话的能力,而说话又创造了人类对宇宙的量度——思想”—Prometheus Unbound, Shelley
人类极其受那些已经成为用来表达他们所处社会的媒介的特定语言的支配。想象一下,如果一个人可以不使用语言就能够从本质上适应现实世界,语言仅仅是为了解决具体的交流和反映问题时偶尔被使用到的方式,那么我们会发现这只能是一种幻想。事实上“真实世界”在很大程度上是不知不觉地创建于群体的语言习惯之上的。
摘自“The Status of Linguistics As A Science”,1929, Edward Sapir。
如同任何人类语言一样,Java提供了一种表达概念的方式。如果使用得当,随着问题变得更庞大更复杂,这种表达媒介将会比别的可供选择的语言要更为简单更为灵活。
我们不应该将Java仅仅看作是一些特性的集合——有一些特性在孤立状态下没有任何意义。如果我们需要考虑设计,而不仅仅只是编码,那么我们可以将Java的各部分作为一个整体来使用。而且如果要按照这种方式去理解Java,我们通常必须理解有关它的问题以及在程序设计时伴随的问题。这本书讨论的是编程问题、它们为什么成为问题,以及Java已经采取的用于解决它们的方案。因此,我在每章所阐述的特性集都是基于我所看到的这一语言在解决特定类型问题时的方式。按照这种方式,我希望能够每次引导你向前前进一点,直到Java思想意识成为你自然不过的语言。
自始至终,我一直持这样的观点:你需要在头脑中创建一个模型,用于加强对这种语言的深入理解;如果你遇到了疑问,你就能够将它反馈给你的模型并推断出答案。
前提条件
本书假定你对程序设计具有一定程度的熟悉:你已经知道程序是一些语句的集合,知道子程序/函数/宏的思想,知道像“if”这样的控制语句和像“while”这样的循环结构,等等。不过,你可能在许多地方已经学到过这些,例如使用宏语言进行程序设计或者使用像Perl这样的工具工作。只要你的程序设计已经到达能够自如地运用程序设计基本思想的程度,你就能够顺利阅读本书。当然,本书对C程序员来说更容易,对于C++程序员更是如此,因此,即使你没有实践过这两种语言,也不要否定自己——而应该乐于努力学习(并且,伴随本书的多媒体光盘能够带领你快速学习所必需的java基础知识)。不过,我还是会介绍面向对象(OOP)的概念和Java的基本控制机制的。
尽管经常引用参考C和C++语言的特性,但这并不是打算让它们成为内部注释,而是要帮助所有的程序员正确看待这些语言,毕竟Java是从这些语言衍生而来的。我将会努力简化这些引用参考,并且解释我认为一个非C/C++程序员可能不太熟悉的任何事情。
学习Java
大概在我的第一本书《Using C++》(Osborne/McGraw-Hill于1989年出版)出版发行的同一时候,我就开始教授这种语言了。讲授程序设计语言已经成为我的职业了;自1987年以来,我在世界各地的听众中看到有的混混欲睡、有的面无表情、有的表情迷茫。当我开始给较小的团体进行室内培训时,在这些实践期间我发现了一些事情。即使那些面带微笑频频点头的人也困惑于对很多问题。我发现,多年来在软件开发会议上由我主持的C++分组讨论会(后来变成Java分组讨论会)中,我和其他的演讲者往往是在极短的时间内告诉听众许多的话题。因此,最后由于听众的水平不同和讲授教材的方式这两方面原因,我可能最终流失了一部分听众。可能这样要求得太多了,但因为我是传统演讲的反对者之一(而且对于大多数人来说,我相信这种抵制是因为厌倦),因此我想尽力让每个人都可以跟得上演讲的进度。
我曾经一度在相当短的时间内做了一系列不同的演讲。因此,我结束了实践和迭代(一项在Java程序设计中也能很好运行的技术)的学习。最后,我使用自己在教学实践中学到的所有东西发展出一门课程。它以离散的、易消化的步骤以及参与讨论班的形式(最理想的学习形式)解决学习问题,并且每一小节课之后都有一些练习。我公司MindView, Inc现在提供公开的和内部的Thinking in Java培训课程;这是我们主要的介绍性培训课程,为以后更高级的培训课程提供基础。你可以到网站www.MindView.net上详细了解。(培训课程的介绍也可以在附带的Java多媒体光盘中得到。在同样的网站上也可以得到这些消息。)
从每个讨论班获得的反馈信息都可以帮助我去修改和重信制订课程教材,直到我认为它能够成为一个良性运转的教学工具为止。不过这本书并不能当作一般的培训课程笔记;我试着在这些书页中放入尽可能多的信息,并且将它构造成能够引导你顺利进入下一课题的结构。最重要的是,这本书是为那些正深入一门新的程序设计语言的单个读者而服务的。
目标
就像我前一本书《Thinking in C++》那样,这本书是围绕着程序设计语言的教学过程而构建的。特别地,我的目的是要建立一套机制,提供一种在自己课程培训班中进行程序语言教学的方式。当我思索书中的一章时,我思索的是如何在培训班上教好一堂课。我的目标是,切割出可以在合理学时内讲完的篇章,随后是适合在课堂上完成的练习作业。
在这本书中我想达到的目标是:
1.每一次只演示一个简单步骤的材料,以便你在继续后面的学习之前可以很容易地消化吸收每一个概念。
2.使用的示例尽可能的简单、简略。这样做有时会妨碍我们解决“真实世界”的问题,但是,我发现对于初学者,通常能够理解例子的每一个细节,而不是理解它所能够解决的问题范畴会为他们带来更多的愉悦。同样,对于在教室内吸引读者学习的代码数量也有严格限制。正因为这些因素,我将毫无疑问地会遭到使用“玩具般的示例”的批评,但是我乐意接受那些有利于为教育带来益处的种种事物。
3.谨慎安排呈现特性的先后顺序,以便使你在看到使用某一主题之前已经接触过它。当然,不可能总是这样;在这种情况下,将会给出简洁的介绍性描述。
4.向你提供那些我认为对理解这种程序设计语言来说是很重要的部分,而不是提供我所知道的任何事情。我相信存在一个信息重要性的层次结构,有一些事实对于95%程序员来说永远不必知道——那些只会困扰人们并且凭添他们对程序复杂性感触的细节。举一个C语言的例子,如果你能够记住操作符优先表(我从未能记住),那么你可以写出灵巧的代码。但是你需要再想一想,这样做会给读者/维护者带来困惑。因此忘掉优先权,在不是很清楚的时候使用圆括号就行了。
5.使每部分的重点足够明确,以便缩短教学时间和练习时段之间的时间。这样做不仅使听众在参与讨论班时的思维更为活跃和集中,而且还可以让读者更具有成就感。
6.给你提供坚实的基础,使你能够充分理解问题,以便转入更困难的课程和书籍中。
JDK的HTML文档
来自于Sun Microsystems公司的Java语言及其类库(可以从java.sun.com免费下载),配套提供了电子版文档,可使用Web浏览器阅读。并且实际上,每个厂商开发的Java编译器都有这份文档或一套等价的文档系统。大部分出版的Java书籍也都有这份文档的备份。所以你或者可能已经拥有了它,或者需要下载;所以除非需要,本书不会再重复那份文档。因为一般来说,你用Web浏览器查找类的描述比你在书中查找要快得多(并且在线文档更可能保持更新)。你仅需要参考“JDK文档”。只有当需要对文档进行补充,以便你能够理解特定实例时,本书才会提供有关类的一些附加说明。
章节
本书设计时在思想中贯穿了一件事:人们学习Java语言的方式。讨论班听众的反馈帮助我了解哪些困难部分需要解释清楚。对于这个领域,在我突然雄心勃勃并且想涵盖如此多的特性之处,我渐渐明白——贯穿讲述材料的过程中——如果涉及到许多新特性,你就需要对它们全部解释清楚,不然这会很容易使学生感到困惑。因此,每次我就费尽大量心思介绍尽可能少的特性。
因此,本书的目标是每一章只讲述一个单一特性,或者是一小组相关特性,而不必依赖于其他还没有讲述过的特性。这样一来你在进入下一特性之前就可以消化当前知识背景中的每个部分。
下面是对本书所含章节的简单描述,它们与我在Thinking in Java讨论班上的授课和练习时段相对应的。
第1章:对象引论
(相应的讲座在光盘上)。这一章是对面向对象的程序设计(OOP)的一个综述,包括对“什么是对象”这种基本问题的回答,接口与实现、抽象与封装、消息与函数、继承与组合以及非常重要的多态概念。你也可以概要了解对象生成的问题,例如构造器,对象存在于什么地方,一旦创建好放在什么地方,以及神奇的垃圾回收器(清除那些不再需要的对象)。还会介绍其他一些问题,包括异常的错误处理,响应用户接口的多线程以及网络和Internet。你将会知道是什么使Java如此特别以及它为什么如此成功。
第2章:一切都是对象
(相应的讲座在光盘上)。本章将引导你编写自己的第一个Java程序。本章开始先综述一些基本要素:对象引用的概念;基本数据类型和数组的简介;对象的生存空间以及垃圾回收器清除对象的方式;怎样将Java中的所有东西归为一种新的数据类型(类);创建自己类的基本要素;方法、参数以及返回值;名字可见性以及从其他类库使用组件;static关键字;以及注释和内嵌文档。
第3章:控制程序流
(相应的一组讲座在Thinking in C的光盘上)。本章以讲述Java引自C / C++的所有运算符为开始。另外,你会看到运算符的共同缺点、转型、类型升级以及优先权。接着介绍基本的控制流程图以及选择操作,这实际上是任何程序设计语言都具有的特性:if-else选择结构,for 和while循环结构,用break和continue退出循环以及Java的标注式break和标注式continue(这说明在Java中没有“goto”),以及switch分支选择。尽管材料大部分具有C 和C++代码的相同思路,但还是存在一些不同之处。
第4章:初始化和清除
(相应的讲座在光盘上)。本章首先介绍构造器,它用来确保正确的初始化。构造器的定义还涉及方法重载的概念(因为你可能同时需要几个构造器)。随后讨论的是清除过程,它并非总是如想象般的那么简单。通常地,当你不再使用一个对象时,可以不必管它,垃圾回收器会最终跟随介入,释放对象占据的内存。这部分详细探讨了垃圾回收器以及它的一些特性。本章最后将更近地观察初始化过程:自动成员初始化、指定成员初始化、初始化的顺序、static(静态)初始化以及数组初始化等等。
第5章:隐藏实现细节
(相应的讲座在光盘上)。本章探讨程序代码被封装到一起的方式,以及为什么类库的某些部分是暴露的,而有一部分则处于隐藏状态。首先要讨论的是package和import关键字,它们执行文件级别上的封装操作,并允许你构造类库。然后探讨目录路径和文件名的问题。本章最后部分讨论public, private以及protected关键字、包内访问的概念以及在不同场合下使用不同访问控制级别的意义。
第6章:复用类
(相应的讲座在光盘上)。复用类的最简单方法是通过组合(composition)将对象嵌入到你的新类中。不过,组合不是从已有的类产生新类的唯一方式。继承这个概念几乎是所有
OOP语言的标准。它是对已有的类加以利用,并为其添加新功能的一种方式(也可以是修改它,这是第7章的主题)。继承常常用于代码的复用,它通过保留相同的“基类”,并且只是将这儿或那儿的东西补缀起来以产生你所期望的类型。在这一章中,大家将学习在Java中组合和继承是怎样重用代码的,以及具体如何运用它们。
第7章:多态
(相应的讲座在光盘上)。如果靠你自己,你可能要花上9个月的时间才能发现和理解多态,这是OOP的基础。通过一些小的、简单的例子,你将会看到如何用继承来创建一族类型,并通过它们共有的基类对该族类型中的对象进行操作。Java的多态可以让你同等地对待同一族中的所有对象,这意味着你编写的大部分代码不必依赖特定的类型信息。这使你的代码更具灵活性,因此,程序的构建和源代码的维护可以变得更为简单,花费也更少。
第8章:接口和内部类
Java提供了专门的工具来建立设计和重用关系:接口,它是对象接口的纯粹抽象。Interface不仅仅只是达到极致的抽象类,由于它允许你通过创建某个可以向上转型到多个基类的类,因此它也实现了类似于C++“多重继承”的变体。
首先,内部类看起来似乎是一种简单的程序代码隐藏机制;你只需将类放置到其他类中。不过,你将会获悉内部类不仅仅只是这些;它可以知晓外围类并能与之通信。你用内部类编写的这种代码更优雅、更清晰。不过,它是一个全新的概念,需要花费一些时间才能习惯于用内部类进行设计。
第9章:异常与错误处理
Java的基本设计哲学是结构不佳的代码将不能运行。编译器会尽可能地去捕获问题,但有时某一问题——或者是程序员错误,或者作为正常执行程序一部分的情形下自然发生的错误——只能在运行时被监测到和被处理。Java具有异常处理机制用来处理在程序运行时产生的任何问题。本章将解释try、catch、throw、throws以及finally等关键字在Java中是怎样运行的,什么时刻你应当“抛”出异常,以及在捕获到它们时应该做些什么。另外,你还会看到Java的标准异常,如何创建自己的异常,在构造器中异常会发生什么,以及如何在异常期间发现异常句柄。
第10章:类型检查
当你仅持有一个对某对象基类的引用时,Java运行时类型识别(RTTI)能让你找出这一对象的确切类型。通常地,你会需要有意识地忽略对象的确切类型,以便让Java的动态绑定机制(多态)能够为那一类型实现恰当的行为。但有时候,当你仅有对某一对象的基类引用时,能够知道该对象的确切类型则会很有帮助。通常这些信息可以让你更有效地执行某些特殊情况下的操作。本章还将介绍Java的反射(reflection)机制。你将会知道RTTI 和反射是什么,它们是如何使用的,以及当不再需要RTTI时,如何避免使用。
第11章:对象的集合
一个程序如果只拥有固定数量的对象,并且这些对象的存在时间已知,那么这个程序只会是一个非常简单的程序。但是通常情况下,你的程序总会在不同的时刻创建出一些新的对象,而这些时刻只有在程序运行时才可以知道。此外,除非进入运行期,否则你无法知道所需要的对象数量,以及它们的确切类型。为了解决这个常见的程序设计问题,我们需要在任何时间、任何地点创建任何数量的对象。本章深入地探讨Java所提供的集合库:从简单的数组到复杂的容器(数据结构),如Vector和Hashtable,以便你在使用它们时可以持有自己所需的一些对象。
第12章:Java I/O系统
理论上,你可以将任何程序都分成三部分:输入、处理和输出。这意味着I/O(输入/输出)是程序非常重要的一部分。在这一章,你将学到Java所提供的各种I/O类,用于读写文件、内存块以及控制台等。Java I/O 的演变以及JDK 1.4 的新I/O (nio) 也会给予阐明。此外,本节还展示了如何获取一个对象、如何对其进行“流化”操作(使对象可以写入磁盘或通过网络传送)以及如何将其重新构造, Java的对象序列化将会为你实现这一切。另外,还将讨论Java的压缩库,用于Java归档文件格式(JAR)。最后,阐述新的优化应用程序接口(API)和正则表达式。
第13章:并发
Java提供了一套内置机制,用以支持多个被称为“线程”的并发子任务。这些线程均在单一的程序内运行。(除非你的机器里安装了多个处理器,否则这将是多子任务的唯一形式)尽管任何地方都可以应用线程,但它大多是被应用于打算创建一个反应灵敏的用户界面的情况,举例来说,虽然有一些别的任务正在执行,但用户仍然可以毫无阻碍地按下按钮或者输入数据。本章会让你在并行程序设计原则中打下坚实的基础。
第14章:创建窗口和Applet程序
Java配套提供了Swing GUI 类库,它是一系列类的集合,能以一种轻便的形式处理窗口。窗口化程序既可以是万维网applet也可以是独立的应用程序。本章将介绍用Swing来创建程序。还展示了Applet签名和 Java Web Start。同时还将介绍重要的“Java Beans”技术,它是创建“快速应用软件开发”(RAD)工具的基础。
第15章:问题发现
程序设计语言检测机制只能让你尽量开发出正确运行的程序。本章介绍一些工具用于解决编译器不能解决的问题。其中向前迈出的最大一步是自动单元测试的合并。对于本书,开发了一个自定义的测试系统确保程序输出的正确性,而且还介绍了一个实际中的标准——JUnit测试系统。开放源码的工具Ant实现了自动构建;并且对于团队开发,阐述说明了CVS的基本要素。对于运行时的问题报送,本章介绍了Java断言机制(这里演示使用的是Design by Contract)、日志记录API、调试器、剖析器、以及doclets(这些用于帮助发现源代码中的问题)。
第16章: 分析和设计
面向对象的模式是一种用于程序设计的崭新的不同以往的思想方式,而且很多人在开始学习怎样开发OOP项目时都会遇到问题。一旦你理解了对象这个概念,而且随着你学会按照面向对象的方式更深入地思考,你就能够开始创建“好的”设计以充分利用OOP提供的好处。本章介绍了分析和设计的思想,以及一些解决问题的方法,用于在合理时间内开发出好的面向对象程序。本章的主题包括:UML图及相关方法、用例、类—职责—合作(CRC)卡片、迭代开发、极限编程(XP)、开发和发展可重用的代码的方式,以及用于向面向对象程序设计过渡(转化)的策略。
附录A:对象的传递和返回
尽管在Java中我们和对象会话的唯一方式是通过引用,但是将对象传递给方法以及将对象从方法返回的概念还是会有一些有趣的结果。此附录说明当你正进入和离开方法时你需要知道哪些是用来操纵对象的,并且还演示了String类的做法,它使用的是另外一种解决问题的方法。
附录B:Java编程指南
这个附录收集了一些我这几年发现和收集到的建议,当你进行低层的程序设计和编写代码时,能够帮助引导你。
附录C:补充
以下是一些从MindView处可得到的附加学习材料的说明:
1.书后面的光盘,包含Foundations for Java,seminar-on-CD,为你学习这本书做好了准备。
2.Hands-On Java光盘的第3版本,可以从www.MindView.net网站上获取。它是基于本书资料的一张seminar-on-CD。
3.Think in Java Seminar。MindView公司——一个主要的基于本书资料的介绍性研讨会。其日程安排和注册页面请参见www.MindView.net。
4.Thinking in Enterprise Java,一本介绍了更先进的Java主题的书,适用于企业版程序设计。可以从www.MindView.net网站上获得。
5.J2EE Seminar,向你介绍真实世界Web使能的以及Java的分布式应用这些实际开发。见www.MindView.net。
6.对象设计及系统研讨会。面向对象的分析、设计及技术实现。见www.MindView.net。
7.Thinking in Patterns(Java版),介绍一些更先进的、关于设计模式和问题解决技术的Java主题。可在www.MindView.net网站上获得。
8.Thinking in Patterns Seminar。一个基于上述书籍的充满活力的研讨会。日程安排和注册页面可见www.MindView.net。
9.Design Consulting and Reviews。协助你的项目处于良好的状态。
附录D:资源
列出我发现特别有用的一系列Java书籍。
练习
在培训班上,我发现一些极其简单的例子对学生的完全理解很是有用,因此在每一章的最后你都会看到一些习题集。
大多数练习设计得都很简单,可以让学生在课堂上在合理的时间内完成这些作业,以便指导老师在查看时,可以确保所有的学生都吸收了教材的内容。有一些题目具有挑战性,但并没有难度很高的题目。(我想,你应该自己找出这些题目——或者更可能的是它们会自动找上门来)。
一些经过挑选的练习答案可以在The Thinking in Java Annotated Solution Guide的电子文档中找到,或者仅需少许费用便可以从www.BruceEckel.com下载得到。
CD-ROM
本书后面配套提供的还有一张光盘。过去我一直反对将光盘附在书的后面,因为我感觉支付了一些额外费用去获取大容量CD上的几千字节的源代码不太明智,相反更喜欢让人们到我的网站上下载这些东西。不过,你将会发现这张CD还有一些不同之处。
这张CD不包含本书的源代码,而是提供了到www.MindView.net网站上的一个超链接(你并不需要链接CD上的地址以获取代码,只要直接到那个网站去找寻即可)。这样做的原因是:在CD送往打印时,源代码还不完整,并且这种方式可以使代码在出现问题的任何时候都能及时得到完善和修正。
因为本书的三个版本之间有非常显著的变化,所以这张CD包含了HTML格式的本书的第一版和第二版,包括因前述理由而在较新的版本中被移除的,但是可能在某些情况下对你还是有用的章节。另外,你可以从www.MindView.net下载本书的当前(第三版)的HTML版本,而且它还包含了被发现并被订正了的修订。HTML版本的一个好处是它的索引是超链接的,所以对它的内容进行导航要简单得多。
不过400+兆字节的CD大部分是一个完整的被称为Foundations for Java的多媒体教程。它包括了Thinking in C培训班讲座,介绍了一些Java所沿用的C语言的语法、操作及函数。此外,还包括源自我所开创并讲授的Hands-On Java seminar-on-CD第二版的前七章的演讲内容。尽管完整的Hands-On Java CD曾经只单独出售(第3版本的Hands-On Java CD也是这样,你到 www.MindView.net网站上可以获得),我之所以决定仅包含第二版的前七章是因为它们和该书的第三版相比没有太大变化,因此它不仅可以向你提供这本书的基础,而且我还希望它还能让你感受到Hands-On Java CD(第3版)的质量和价值。
我原本打算让Chuck Allison把作为seminar-on-CD ROM一部分的Thinking in C创建成一个单独产品,不过我还是决定将它和第二版本的Thinking in C++和Thinking in Java包含在一起,这样做是为了让参加培训班的、没有太多C语言基本语法背景的人们具有连贯一致的体验。应该抛开这种思想“我是一个聪明的程序员,我不想学习C,而想学习C++或Java,因此我会跳过C直接到C++/Java。”在到了培训班以后,这些人渐渐明白对
C语言语法很好的理解这个先决条件很有必要。通过本书配套提供的光盘,我们相信每个参加培训班的人都能够事先做好充分准备。
这张CD也让这本书获得了更多的读者。即使书中第三章(程序控制流)没有介绍Java继承自C的基本部分,但是这张CD却进行了很好的介绍,而且它要求的学生应该具备的程序设计背景比这本书要求的还要少。并且通过Hands-On Java CD第二版中相应的讲稿来贯通前七章的资料,应该可以帮助你在进入Java的学习之前打下更加扎实的基础。这张CD也期望更多的人能够加入Java程序设计的大军。只有在网站www.BruceEckel.com上直接订购后才能获得Hands-On Java CD ROM第三版本。
源代码
本书的所有源代码都可以以保留版权的免费软件的形式得到,它们是以一个单一包的形式发布的,访问www.BruceEckel.com网站便可获取。为了确保你获得的是最新版本,这个发布这些源代码和本书电子版的网站是一个官方网站。你也可以在其他站点上找到这本电子书籍和这些代码的镜像版本(有一些站点已经在www.BruceEckel.com列出),不过你应该检查这个官方网站以确保镜像版本确实是最新的版本。你可以在课堂或其他的教育场所发布这些代码。
保留版权的主要目的是为了确保源代码能够被正确地引用,并且防止在未经许可的情况下,在打印媒体中重新发布这些代码。(只要说明是引用了这些代码,那么在大多数媒介中使用本书中的示例通常不是问题。)
在每个源码文件中,都可以发现下述版本声明文字:
This computer source code is Copyright ©2003 MindView, Inc.All Rights Reserved.
Permission to use, copy, modify, and distribute this computer source code (Source Code) and its documentation without fee and without a written agreement for the purposes set forth below is hereby granted, provided that the above copyright notice, this paragraph and the following five numbered paragraphs appear in all copies.
1. Permission is granted to compile the Source Code and to include the compiled code, in executable format only, in personal and commercial software programs.
2. Permission is granted to use the Source Code without modification in classroom situations, including in presentation materials, provided that the book "Thinking in Java" is cited as the origin.
3. Permission to incorporate the Source Code into printed
media may be obtained by contacting
MindView, Inc. 5343 Valle Vista La Mesa, California 91941
Wayne@MindView.net
4. The Source Code and documentation are copyrighted by MindView, Inc. The Source code is provided without express or implied warranty of any kind, including any implied warranty of merchantability, fitness for a particular purpose or non-infringement. MindView, Inc. does not warrant that the operation of any program that includes the Source Code will be uninterrupted or error- free. MindView, Inc. makes no representation about the suitability of the Source Code or of any software that includes the Source Code for any purpose. The entire risk as to the quality and performance of any program that includes the Source code is with the user of the Source Code. The user understands that the Source Code was developed for research and instructional purposes and is advised not to rely
exclusively for any reason on the Source Code or any program that includes the Source Code. Should the Source Code or any resulting software prove defective, the user assumes the cost of all necessary servicing, repair, or correction.
5. IN NO EVENT SHALL MINDVIEW, INC., OR ITS PUBLISHER BE LIABLE TO ANY PARTY UNDER ANY LEGAL THEORY FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOST PROFITS, BUSINESS INTERRUPTION, LOSS OF BUSINESS INFORMATION, OR ANY OTHER PECUNIARY LOSS, OR FOR PERSONAL INJURIES, ARISING OUT OF THE USE OF THIS SOURCE CODE AND ITS DOCUMENTATION, OR ARISING OUT OF THE INABILITY TO USE ANY RESULTING PROGRAM, EVEN IF MINDVIEW, INC., OR ITS PUBLISHER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. MINDVIEW, INC. SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE SOURCE CODE AND DOCUMENTATION PROVIDED HEREUNDER IS ON AN "AS IS" BASIS, WITHOUT ANY ACCOMPANYING
SERVICES FROM MINDVIEW, INC., AND MINDVIEW, INC. HAS NO OBLIGATIONS TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
Please note that MindView, Inc. maintains a web site which is the sole distribution point for electronic copies of the Source Code, http://www.BruceEckel.com (and official mirror sites), where it is freely available under the terms stated above.
If you think you've found an error in the Source Code, please submit a correction using the URL marked "feedback" in the electronic version of the book, nearest the error you've found.
你可以在自己的项目中引用这些代码,也可以在课堂上引用它们(包括你的演示材料),只要保留每个源文件中出现的保留版权声明即可。
编码标准
在本书的正文中,标识符(方法、变量和类名)被设为粗体。大多数关键字也被设为粗体,但是不包括那些频繁使用的关键字,例如“class”,因为如果将它们也设为粗体会令人十分厌烦。
对于本书中的示例,我使用了一种特定的编码格式。此格式遵循Sun自己在所有代码中实际使用的格式,在它的网站上你会发现这些代码(见java.sun.com/docs/codeconv/index.html),并且似乎大多数Java开发环境都支持这种格式。如果你已经读过我的其他著作,你会注意到Sun的编码格式与我的一致——尽管这与我没有什么关系,但我还是很高兴。对代码进行格式化这个议题常常会招致几个小时的热烈争论,因此我不会试图通过自己的示例来规定正确的格式;我对我自己使用的格式有着我自己的动机。因为Java是一种自由形式的程序设计语言,所以你可以继续使用任何自己感觉舒服的格式。
本书中的程序都直接来自于编译过的文件,通过文本处理器,以文本形式呈现。因此,本书打印出的代码文件全部都能够运行,而且无编译错误。那些会引起编译错误消息的错误已经用//!标注出来了,以便可以使用自动方法来很容易地发现并测试它们。那些被发现并被报送给作者的错误将首先出现在发布的源代码中,并随后出现在本书的更新材料中(还会在网站www.BruceEckel.com上出现)。
Java版本
在判断代码行为是否正确时,我通常以Sun公司的Java实现为参考。
这本书聚焦在Java 2与JDK 1.4上,并使用它们进行测试。如果你需要学习在本书的本版本中没有讨论过的Java语言的先前版本,可以从网站www.BruceEckel.com自由下载本书的第一版和第二版,它们也被包含在本书所附的CD中。
错误
无论作者使用多少技巧去发现错误,有些错误总还是悄悄地潜藏了起来,并且经常对新读者造成困扰。
由于机敏的读者所提供的反馈对我是如此的有价值,因此我开发了名为BackTalk的几个版本的反馈系统(该系统使用几种不同的技术,得到了Bill Venners的辅助,在其他很多人的帮助下得以实现)。在本书的电子版本(可以从www.BruceEckel.com自由下载)中,文中的每个段落都有自己唯一的URL,点击它可以为该特定段落产生一封将你的意见记录到BackTalk系统的邮件。这种方式使其很容易追踪和更新修正。如果你发现了任何你确信是错误的东西,请使用BackTalk系统提交错误以及你建议的修正。对你的帮助不胜感激。
封面故事
《Thinking in Java》的封面创作灵感来自于美国的 Arts & Crafts运动,该运动始于世纪之交,并在1900 到1920年期间达到顶峰。它起源于英格兰,是对工业革命带来的机器产品和维多利亚时代高度装饰化风格的回应。Arts & Crafts强调简洁设计,而回归自然是其整个运动的核心,注重手工制造以及推崇个人手工业者,可是它并不回避使用现代工具。这和我们现今的情形有很多相似之处:世纪之交,从计算机革命的最初起源到对个人来说更精简更意味深长的事物的演变,以及对软件开发技能而不仅是生产程序代码的强调。
我以同样的眼光看待Java:尝试将程序员从操作系统的机制中解放出来,朝着“软件艺师”的方向发展。
本书的作者和封面设计者(他们自孩提时代就是朋友)从这次运动中获得灵感,并且都拥有源自那个时期的或受那个时期启发而创作的家具、台灯和其他作品。
这个封面暗示的另一主题是一个收集盒,自然学家可以用它来展示他或她保存的昆虫标本。这些昆虫被看作是对象,被放置到“盒”这个对象当中。而盒对象本身放置到“封面对象”当中,这阐释说明了面向对象程序设计中最为基本的“集合”概念。当然,程序员可能不会从中得到任何帮助,只会联想到“程序臭虫(Bug)”;这些虫子被捕获并假设在标本罐中被杀死,最后禁闭于一个展示盒中,似乎暗示Java有能力发现、显示和制服程序臭虫(事实上,这也是它最为强大的属性之一)
致谢
首先感谢和我一起授课,提供咨询和开发教学计划的这些合作者:Andrea Provaglio, Dave Bartlett, Bill Venners, Chuck Allison, Jeremy Meyer, 和 Larry O’Brien。在我转而继续去竭力为那些像我们一样的独立人群开发在一起协同工作的最佳模式的时候,你们的耐心让我感激不已。
最近,无疑是因为有了Internet,我可以和极其众多的人们一起合作,协助我一起努力,他们通常是在自己的家庭办公室(home office)中工作。过去,我可能必须为这些人们提供相当大的办公空间,不过由于现在有了网络、传真以及偶尔打打的电话,我不需要额外的开销就可以从他们的帮助中受益。在我尽力学习更好地与其他人相处的过程中,你们对我全部都很有帮助,并且我希望继续学习怎样使我的工作能够通过他人的努力变得更出色。Paula Steuer在接管我偶尔的商务实践时发挥了不可估量的价值,他使它们变得井井有条了(Paula,感谢你在我懈怠时对我的鞭笞)。Jonathan Wilcox, Esq详细审视了我公司的组织结构,推翻了每一块可能隐藏祸害的石头,并且使所有事情都条理化和合法化了,这让我们心服口服。感谢你的细心和耐心。Sharlynn Cobaugh (他发现了Paula)使自己成为声音处理的专家,是创建多媒体培训CD ROM和解决其他问题的精英成员之一。感谢你在面临难于处理的计算机问题时的坚定不移。Evan Cofsky (Evan@TheUnixMan.com)已经成为了我开发过程中的重要一员,像一只鸭子那样沉迷于Python程序设计语言(嗯,这样一种混杂的隐喻可能会产生一个臃肿的Python脚本),而且解决了多种的难题,包括将BackTalk(最终?)再构造到一个email驱动的XML数据库中。在布拉格Amaio的人们
也提出了一些方案来帮助我。Daniel Will-Harris最先受到利用Internet进行工作的启发,因此他当然是我的所有设计方案的主要人物。
对于这项工程,我采用了另一个曾在我的头脑中翻腾过一段时间的措施。2002年夏天,我在科罗拉多州的Crested Butte创建了一个实习项目,最初找到了两个实习生,而最后项目结束时有5个(有2个志愿者)。他们不仅为本书做出了贡献,而且帮助我专心致志地搞这个项目。感谢他们:JJ Badri, Ben Hindman, Mihajlo Jovanovic, Mark Welsh。Chintan Thakker能够留下并呆到第二个实习期(贯穿本书编写的最后处理过程及其他的工作),因此我必须在Mount Crested Butte租赁实习公寓,我们广招志愿者,最后招到了Mike Levin, Mike Shea, 和 Ian Phillips,他们都做出了贡献。以后我可能还要再进行其它的实习项目,请访问网站www.MindView.net查看相关消息。
感谢Doyle Street Cohousing Community(道尔街住房社区)容忍我花了两年的时间来写这本书(并且一直在容忍我所做的一切)。非常感谢Kevin和Sonda Donovan,在我编写本书第一版的夏季里,他们把位于科罗拉多州宜人的Crested Butte市里面的住处租给了我(也感谢Kevin为我在CB的住处所做的重新装修)。也感谢Crested Butte友好的居民;以及Rocky Mountain Biological Laboratory(岩石山生物实验室),让我有宾至如归的感觉。我在CB的瑜伽老师Maria 和 Brenda,在我编写第三版期间帮助我保持了健康的体魄。
当老师们来提供培训时,科罗拉多州Crested Butte的Camp4 Coffee,已经成为了标准住所,并且在培训班中间休息期间,它是我所遇到的最好最便宜的饮食场所。感谢我的密友Al Smith,是他使这里成为如此好的一个地方,成为Crested Butte培训期间一个如此有趣和愉快的场所。
感谢Moore Literary Agency的Claudette Moore,因为她无比的耐心和毅力,我才能得到我真正想要的。感谢Prentice Hall的Paul Petralia不断地为我提供我所需要的一切,而且不厌其烦地帮我把所有事情都搞定(并容忍我所有的特殊需求)。
我的前两本书在Osborne/McGraw-Hill出版时,Jeff Pepper是编辑。Jeff总是在Prentice Hall恰当的地点和恰当的时间出现,他将责任转交给Paul之前,为这些书奠定了最初的根基。感谢你,Jeff。
感谢Rolf André Klaedtke (瑞士); Martin Vlcek, Vlada & Pavel Lahoda, (布拉格);和 Marco Cantu (意大利)在我第一次自行组织的欧洲研讨会巡展中对我的热情款待。
感谢Gen Kiyooka和他的同事Digigami,他慷慨地为我前几年的网上授课提供了Web服务器。这是无价的辅助学习手段。
特别感谢Larry 和Tina O’Brien,他们帮助我把我的培训课程制作成了第一版的Hands-On Java光盘。(你可以到网站www.BruceEckel.com查看更多消息。)
在我开发期间,某些开放源码的工具已经被证明是无价的;并且每次使用它们时都会非常感激它们的创建者。Cygwin (http://www.cygwin.com)为我解决了无数Windows不能解决的问题,并且每天我都会变得更加依赖它(如果在15年前当我的头脑因为使用Gnu
Emacs而搞得发懵的时候,能有这些该多好啊)。CVS 和Ant已经成为了在我的Java开发过程必不可少的部分,现在我已经无法再返回不用它们的时代了。我现在甚至已经变得喜欢JUnit了(http://www.junit.org),因为他们实际上已经使它成为了“可以运转的最简单的事物。”IBM的 Eclipse (http://www.eclipse.org)对开发社区做出了真正杰出的贡献,并且随着它的不断升级,我期望能看到它的更伟大之处(IBM是怎样成为潮流所向的?我肯定错过了一份备忘录)。Linux在开发过程中每天都要用到,特别对实习生来说尤为如此。当然,如果我在其他地方强调得还不够的话,我得再次重申,我经常使用Python(www.Python.org)解决问题,在我的密友Guido Van Rossum和PythonLabs那些身材臃肿愚笨的天才人物的智慧结晶的基础上,我花费了好几天的时间在Zope 3上进行极限编成(XP)(Tim,我现在已经把你借的鼠标加了个框,正式命名为“TimMouse”)。你们这伙人必须到更健康的地方去吃午餐。(还要感谢整个Python社区,他们是一帮令人吃惊的人们)。
很多人向我发送修正意见,我感激所有这些人,第一版特别要感谢:Kevin Raulerson (发现无数的程序臭虫), Bob Resendes (简直难于置信), John Pinto, Joe Dante, Joe Sharp (三位都难于置信), David Combs (校正了许多语法和声明), Dr. Robert Stephenson, John Cook, Franklin Chen, Zev Griner, David Karr, Leander A. Stroschein, Steve Clark, Charles A. Lee, Austin Maher, Dennis P. Roth, Roque Oliveira, Douglas Dunn, Dejan Ristic, Neil Galarneau, David B. Malkovsky, Steve Wilkinson,以及许许多多的人。本书第一版本在欧洲发行时,Marc Meurrens在电子版宣传和制作方面都做出了巨大的努力。
感谢在第2版本中,那些使用Swing类库帮助我重新编写示例的人,以及其他助手:Jon Shvarts, Thomas Kirsch, Rahim Adatia, Rajesh Jain, Ravi Manthena, Banu Rajamani, Jens Brandt, Nitin Shivaram, Malcolm Davis,以及所有表示支持的人。
曾经有许多技术人员走进我的生活,他们后来都和我成了朋友。他们对影响了我,并对我来说他们是不寻常的,因为他们平时练习瑜伽功,以及另一些形式的精神训练,我发现这些很具有启发性和指导意义。他们是Kraig Brockschmidt,GenKiyooka和Andrea provaglio(他帮助我了解了Java和程序设计在意大利的概况,现在他在美国,是MindView团队的一员)。
对Delphi的一些理解使我更容易理解Java,这一点都不奇怪,因为它们有许多概念和语言设计决策是相通的。我的Delphi朋友提供了许多帮助,使我能够洞察一些非凡的编程环境。他们是Marco Cantu(另一个意大利人——难道会说拉丁语的人在学习Java时有得天独厚的优势?)、Neil Rubenking(直到发现喜欢计算机之前,他一直都在做瑜珈/素食/禅道),当然还有Zack Urlocker(Delphi产品经理),他是我游历世界时的好伙伴。
我的朋友Richard Hale Shaw(以及Kim)的洞察力和支持都很有帮助。Richard和我花了数月的时间将教学内容合并到一起,并为参加学习的学生设计出一套完美的学习体验。
书籍设计、封面设计以及封面照片是由我的朋友Daniel Will-Harris制作的。他是一位著名的作家和设计家(http://www.WillHarris.com),在计算机和桌面排版发明之前,他在初中的时候就常常摆弄刮擦信(rub-on letter)。他总是抱怨我的代数含糊不清。然而,要声明的是,是我自己制作的照排好的(camera-ready)页面,所以所有排字错误都应该
算到我这里。我是用Microsoft® Word XP for Windows来编写这本书的,并使用Adobe Acrobat制作照排页面的。本书是直接从Acrobat PDF文件而创建的。电子时代给我们带来了厚礼,我恰巧是在海外创作了本书第一版和第二版的最终稿——第一版是在南非的开普敦送出的,而第二版却是在布拉格寄出的。第三版则来自科罗拉多州的Crested Butte。本书中正文字体是Georgia,标题是Verdana。封面字体是ITC Rennie Mackintosh。
特别感谢我的所有老师和我的所有学生(他们也是我的老师),其中最有趣的一位写作老师是Gabrielle Rico(《Writing the Natural Way》一书的作者,Putnam于1983年出版)。我将一直珍藏对在Esalen所经历的非凡的一周的记忆。
书后面的照片是我爱人Dawn McGee照的,并且是她让我那样地笑的。
曾向我提供过支持的朋友包括(当然还不止他们):Andrew Binstock,SteveSinofsky,JD Hildebrandt,Tom Keffer,Brian McElhinney,Brinkley Barr,《Midnight Engineering》杂志社的Bill Gates,Larry Constantine和LucyLockwood,Greg Perry,Dan Putterman,Christi Westphal,Gene Wang,DaveMayer,David Intersimone,Andrea Rosenfield,Claire Sawyers,另一些意大利朋友(Laura Fallai,Corrado,Ilsa和Cristina Giustozzi),Chris和Laura Strand,Almquists,Brad Jerbic,Marilyng Cvitanic,Mabrys,Haflingers,Pollocks,Peter Vinci,Robbins Families,Moelter Families(和McMillans),Michael Wilk,Dave Stoner,Laurie Adams,Cranstons,Larry Fogg,Mike和Karen Sequeira,Gary Entsminger和Allison Brody,KevinDonovan和Sonda Eastlack,Chester和Shannon Andersen,Joe Lordi,Dave和Brenda Bartlett,David Lee,Rentschlers,Sudeks,Dick,Patty和Lee Eckel,Lynn和Todd以及他们的家人。当然还有我的爸爸和妈妈。
[/color]