从本书获得的各项大奖以及来自世界各地的读者评论中,不难看出这是一本经典之作。本书作者有多年的教学经验,对C、C++、Java语言都有独到、深入的理解。因此他非常了解如何教授Java语言这门课程,也非常明白语言教学中的难点及人们的困惑。作者以通俗易懂及小而直接的示例解释了一个个晦涩抽象的概念,精心选取“对读者理解Java语言来说最为重要”的部分编写成书。同时又在随书光盘中提供了大量参考材料—这也是本书绝对物超所值的地方。\r\n 随书光盘没有包含本书的源代码(可以从支持网站www.MindView.net免费下载),而是提供了大量作者讲授的讨论课内容及本书的前2版内容。\r\n 本书内容丰富—从Java的基础语法到最高级特性,适合各层次的Java程序员阅读,同时也是高等院校讲授面向对象程序设计语言及Java语言的绝佳教材。
第1章 对象导论\r\n 1.1 抽象过程\r\n 1.2 每个对象都有一个接口 \r\n 1.3 每个对象都提供服务\r\n 1.4 被隐藏的具体实现\r\n 1.5 复用具体实现\r\n 1.6 继承:复用接口\r\n 1.7 伴随多态的可互换对象\r\n 1.8 对象的创建、使用和生命期\r\n 1.8.1 集合与迭代器\r\n 1.8.2 单根继承结构\r\n 1.8.3 向下转型与模板/泛型\r\n 1.8.4 确保正确清理\r\n 1.9 异常处理:处理错误\r\n 1.10 并发性\r\n 1.11 持久性\r\n 1.12 Java与Internet\r\n 1.12.1 Web是什么\r\n 1.12.2 客户端编程\r\n 1.12.3 服务器端编程\r\n 1.12.4 应用\r\n 1.13 Java为什么成功\r\n 1.13.1 系统易于表达、易于理解\r\n 1.13.2 类库的巨大影响力\r\n 1.13.3 错误处理\r\n 1.13.4 大型程序设计 \r\n 1.14 Java与C++\r\n 1.15 总结\r\n第2章 一切都是对象\r\n 2.1 用引用操纵对象\r\n 2.2 必须由你创建所有对象\r\n 2.2.1 存储到什么地方\r\n 2.2.2 特例:基本类型 \r\n 2.2.3 Java中的数组\r\n 2.3 永远不需要销毁对象 \r\n 2.3.1 作用域\r\n 2.3.2 对象的作用域\r\n 2.4 创建新的数据类型:类\r\n 2.5 方法、参数和返回值\r\n 2.6 构建一个Java程序\r\n 2.6.1 名字可见性\r\n 2.6.2 运用其他构件\r\n 2.6.3 static 关键字\r\n 2.7 你的第一个Java程序\r\n 2.8 注释和嵌入式文档\r\n 2.8.1 注释文档\r\n 2.8.2 语法\r\n 2.8.3 嵌入式HTML\r\n 2.8.4 一些标签示例\r\n 2.8.5 文档示例\r\n 2.9 编码风格\r\n 2.10 总结 \r\n 2.11 练习\r\n第3章 控制程序流程\r\n 3.1 使用Java操作符\r\n 3.1.1 优先级\r\n 3.1.2 赋值\r\n 3.1.3 算术操作符\r\n 3.1.4 自动递增和递减\r\n 3.1.5 关系操作符 \r\n 3.1.6 逻辑操作符\r\n 3.1.7 按位操作符\r\n 3.1.8 移位操作符\r\n 3.1.9 三元操作符 if-else\r\n 3.1.10 逗号操作符\r\n 3.1.11 字符串操作符+\r\n 3.1.12 使用操作符时常犯的错误\r\n 3.1.13 类型转换操作符\r\n 3.1.14 Java没有“sizeof” \r\n 3.1.15 再论优先级\r\n 3.1.16 操作符小结\r\n 3.2 执行流程控制\r\n 3.2.1 true和false\r\n 3.2.2 if-else\r\n 3.2.3 return\r\n 3.2.4 迭代\r\n 3.2.5 do-while\r\n 3.2.6 for\r\n 3.2.7 break和 continue\r\n 3.2.8 switch\r\n 3.3 总结\r\n 3.4 练习 \r\n第4章 初始化与清理\r\n 4.1 用构造器确保初始化\r\n 4.2 方法重载\r\n 4.2.1 区分重载方法\r\n 4.2.2 涉及基本类型的重载\r\n 4.2.3 以返回值区分重载方法\r\n 4.2.4 缺省构造器\r\n 4.2.5 this关键字\r\n 4.3 清理:终结处理和垃圾回收\r\n 4.3.1 finalize()的用途何在\r\n 4.3.2 你必须实施清理\r\n 4.3.3 终结条件\r\n 4.3.4 垃圾回收器如何工作\r\n 4.4 成员初始化\r\n 4.4.1 指定初始化\r\n 4.4.2 构造器初始化\r\n 4.5 数组初始化\r\n 4.6 总结\r\n 4.7 练习\r\n第5章 隐藏具体实现\r\n 5.1 包:程序库单元\r\n 5.1.1 创建独一无二的包名\r\n 5.1.2 定制工具库\r\n 5.1.3 用 import改变行为\r\n 5.1.4 对使用包的忠告\r\n 5.2 Java访问权限修饰词\r\n 5.2.1 包访问权限\r\n 5.2.2 public:接口访问权限 \r\n 5.2.3 private: 你无法访问\r\n 5.2.4 protected:继承访问权限\r\n 5.3 接口和实现\r\n 5.4 类的访问权限\r\n 5.5 总结\r\n 5.6 练习\r\n第6章 复用类\r\n 6.1 组合语法\r\n 6.2 继承语法\r\n 6.3 结合使用组合和继承\r\n 6.3.1 确保正确清理\r\n 6.3.2 名称屏蔽\r\n 6.4 在组合与继承之间选择\r\n 6.5 protected关键字\r\n 6.6 增量开发\r\n 6.7 向上转型\r\n 6.8 final关键字\r\n 6.8.1 final 数据\r\n 6.8.2 final 方法\r\n 6.8.3 final 类\r\n 6.8.4 有关final的忠告\r\n 6.9 初始化及类的加载 \r\n 6.10 总结 \r\n 6.11 练习\r\n第7章 多态\r\n 7.1 再论向上转型\r\n 7.2 转机\r\n 7.2.1 方法调用绑定\r\n 7.2.2 产生正确的行为\r\n 7.2.3 可扩展性\r\n 7.2.4 缺陷:“覆盖”私有方法\r\n 7.3 抽象类和抽象方法\r\n 7.4 构造器和多态\r\n 7.4.1 构造器的调用顺序\r\n 7.4.2 继承与清理\r\n 7.4.3 构造器内部的多态方法的行为\r\n 7.5 用继承进行设计\r\n 7.5.1 纯继承与扩展\r\n 7.5.2 向下转型与运行时类型识别\r\n 7.6 总结\r\n 7.7 练习\r\n第8章 接口与内部类 \r\n……\r\n第9章 通过异常处理错误\r\n第10章 类型检查\r\n第11章 对象的集合\r\n第12章 Java I/O系统\r\n第13章 并发\r\n第14章 创建窗口与applet程序\r\n第15章 发现问题\r\n第16章 分析与设计\r\n附录A 对象的传递与返回 \r\n附录B Java编程指南\r\n附录C 补充材料 \r\n附录D 资源 \r\n索引
《 Java编程思想》已经成为广大Java程序员和爱好者们手中必备的宝典,它在读者心目中的地位已经无可替代。其作者Bruce Eckel也已经成为了众多Java程序员顶礼膜拜的大师。随着Java技术的发展以及对Java认识的不断深入,Bruce Eckel推出了《Java编程思想》第3版。在这里我们应该向他致敬,他不断精益求精、锐意进取的精神正是我们努力学习的榜样。
随着软件开发技术,尤其是 Web应用开发技术的发展,Java越来越受到人们的青睐。越来越多的企业都选择使用Java及其相关技术(例如J2EE技术)来构建它们的应用系统。但是,掌握好Java语言并不是一件可以轻松完成的任务,如何真正掌握Java语言,从而编写出健壮的、高效的、灵活的程序,是Java程序员们面临的重大挑战。
《 Java编程思想》就是一本能够让Java程序员轻松面对这一挑战,并最终取得胜利的经典书籍。本书深入浅出、循序渐进地把我们领入Java的世界,让我们在不知不觉中学会了用Java的思想去考虑问题、解决问题。本书不仅适合Java的初学者,对于有经验的Java程序员来说,每次阅读本书也总能有新的体会,这正是本书的魅力所在。
本书的第 2版由侯捷先生翻译,他已经把翻译原著这项工作做到了极致。我们在翻译过程中总是诚惶诚恐,一方面害怕曲解了原著的意思,另一方面也害怕破坏了第2版译著已经做出的让广大中国读者认可本书的种种努力。
我们在翻译本书的过程中力求忠于原著,对于书中出现的大量的专业术语尽量遵循标准的译法,并在有可能引起歧义之处著上了英文原文,以方便读者的对照理解。
全书的翻译由陈昊鹏和饶若楠合作完成,薛翔、郭嘉和方小丽也参与了全书的翻译工作。由于我们水平有限,书中出现错误与不妥之处在所难免,恳请读者批评指正。
陈昊鹏
上海交通大学软件学院
Bruce Eckel是MindView公司(www.MindView.net)的总裁,他在面会、咨询、指导和设计评审。除本书外,Bruce Eckel还是《Thinking in C++》的作者,并与人合著了《Thinking in C#》。他发表过150多篇文章,有20多年世界各地的研讨会和演讲经验。他是C++标准委员会拥有表决权的成员之一,拥有应用物理学学士和计算机工程学硕士学位。
“上帝赋予人类说话的能力,而言语又创造了思想,思想是人类对宇宙的量度。”
—摘自《 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程序设计中也得到很好运用的技术)的学习。最后,我根据自己在教学实践中学到的东西发展出一门课程。它以离散的、易消化的步骤以及亲身参与的讨论课(seminar)的形式(最理想的学习形式)解决学习问题,并且每一小节课之后都有一些练习。我的公司—MindView有限公司现在提供公开的室内“Thinking in Java”讨论课;这是我们主要的初级讨论课,为以后更高级的讨论课提供基础。读者可以到网站www.MindView.net上了解详细情况。(初级讨论课在“Hands-On Java”光盘上也能找到。上述网站也可以找到相关信息。)
从每个讨论课获得的反馈信息都可以帮助我去修改和重新制定课程教材,直到我认为它能够成为一个良性运转的教学工具为止。不过不能将本书视为一般的讨论课笔记;我努力在本书中放入尽可能多的信息,并且合理地组织本书结构,从而引导读者顺利进入下一主题。最重要的是,本书面向那些孤军奋战一门新的程序设计语言的读者。
目标
就像我前一本书《 Thinking in C++》那样,这本书是围绕着程序设计语言的教学过程而构建的。具体地说,我的目的是要建立一套机制,提供一种在自己的讨论课中进行程序语言教学的方式。当我思索书中的一章时,我思索的是如何在讨论课上教好一堂课。我的目标是,精选出可以在合理学时内讲完的篇章,随后是适合在课堂上完成的练习作业。
在这本书中我想达到的目标是:
1) 每一次只演示一个步骤的材料,以便读者在继续后面的学习之前可以很容易地消化吸收每一个概念。
2) 使用的示例尽可能简单、短小。这样做有时会妨碍我们解决“真实世界”的问题,但是,我发现对于初学者,能够理解例子的每一个细节,而不是理解它所能够解决的问题范畴,前者通常更能为他们带来愉悦。同样,适合在教室内学习的代码数量也有严格限制。正因为如此,我将毫无疑问地会遭到批评—批评我使用“玩具般的示例”,但是我乐意接受那些有利于为教育带来益处的种种事物。
3) 谨慎安排、呈现特性的先后顺序,以便读者循序渐进,在学习应用某一主题之前已经先接触过它。当然,不可能总是这样;在这种情况下,将会给出简洁的介绍性描述。
4) 向读者提供“我认为对理解这种程序设计语言来说很重要”的部分,而不是提供我所知道的所有事情。我相信信息在重要性上存在层次差别,有一些事实对于95%的程序员来说永远不必知道—那些只会困扰他们并且使他们对程序复杂性平添许多感触。举一个C语言的例子,如果能够记住操作符优先表(我从未记住过),那么可以写出灵巧的代码。但是你要再想一想,这样做会给读者/维护者带来困惑。因此忘掉优先权,在不是很清楚的时候使用圆括号就行了。
5) 使每部分的重点足够明确,以便缩短教学和练习之间的时间。这样做不仅使听众在亲身参与讨论课时思维更为活跃和集中,而且还可以让读者更具有成就感。
6) 给读者打下坚实的基础,使读者能够充分理解问题,以便转入更难的课程学习和书籍阅读中。
JDK的HTML文档
Sun公司的Java语言及其类库(可以从java.sun.com免费下载)配套提供了电子版文档,可使用Web浏览器阅读。并且,实际上每个厂商开发的Java编译器都有这样的文档系统。大部分出版的Java书籍中也都有这份文档的备份。你可能已经拥有了它,或者能够下载;所以除非必要,本书不会再重复那份文档。因为一般来说,用Web浏览器查找类的描述比在书中查找要快得多(并且在线文档更能保持更新)。你仅需要参考“JDK文档”。只有当需要对文档进行补充,以便你能够理解特定实例时,本书才会提供有关类的一些附加说明。
章节设计
本书设计时贯穿了一个思想:人们学习 Java语言的方式。讨论课听众的反馈帮助我知道了哪些部分是困难的,需要解释清楚。对那些我突然雄心勃勃地想一次介绍很多特性的地方,我渐渐明白(贯穿讲述材料的过程中),如果涉及许多新特性,你就需要对它们全部解释清楚,不然这会很容易使学生感到困惑。因此,我尽量一次少介绍一些特性。
因此,本书的目标是每一章只讲述一个特性,或者是一小组相关特性,而且它们不必依赖于其他还没有讲述过的特性。这样,你在学习下一特性之前就可以消化当前知识背景中的每个部分。
下面是对本书所含章节的简单描述,它们与我在“ Thinking in Java”讨论课上的授课和练习时段相对应。
第 1章:对象导论
(相应的讲座在光盘上。)这一章是对面向对象程序设计( OOP)的一个综述,包括对“什么是对象”这种基本问题的回答,并介绍了接口与实现、抽象与封装、消息与函数、继承与组合以及非常重要的多态概念。读者还可以大致了解对象的生成问题,例如构造器,对象存活于什么地方,一旦创建好放在什么地方,以及神奇的垃圾回收器(清除那些不再需要的对象)。还会介绍其他一些问题,包括通过异常进行错误处理,响应用户接口的多线程以及联网和Internet。读者将会知道使Java如此特别以及它为什么如此成功的原因。
第 2章:一切都是对象
(相应的讲座在光盘上。)该章将引导你编写自己的第一个 Java程序。该章开始先综述一些基本要素:对象引用的概念;基本数据类型和数组简介;对象的生存空间以及垃圾回收器清理对象的方式;怎样将Java中的所有东西归为一种新的数据类型(类);创建自己的类的基本要素;方法、参数以及返回值;名字可见性及从其他类库使用组件;static关键字;以及