Java 面向对象程序设计教程
作者 : (美)Dennis Kafura
译者 : 袁晓华
丛书名 : 计算机科学丛书
出版日期 : 2003-03-01
ISBN : 7-111-11581-3
定价 : 49.00元
教辅资源下载
扩展信息
语种 : 简体中文
页数 : 500
开本 : 16开
原书名 : Object-Oriented Software Design and Construction With Java
原出版社: Prentice Hall
属性分类: 教材
包含CD :
绝版 : 已绝版
图书简介

本书综合介绍了面向对象编程的各种概念、软件工程中的问题以及Java语言的特征。本书内容全面,习题丰富。更有特色的是在全书中使用了两个反复出现的例子:图形用户界面和生态仿真系统。随着讲解内容的不断深入,逐步增加了这两个例子的功能并扩展其应用。这种循序渐进,并结合具体实例的编排方式有助于读者更好地理解面向对象编程的方法和技术。
本书适合作为计算机及相关专业本科教材,也可供各类面向对象程序设计开发人员自学和参考。

图书前言

本书的读者对象是大学的本科生。假定读者已经预先学过一门编程语言的课程。弗吉尼亚技术学院的学生在二年级的第一学期使用过本书的讲义稿。特别要指出的是,阅读本书只需要理解基本的数据结构(如链表、堆栈等),并且只在课程的下半部分会用到。不需要上专门的数据结构课程。
本书重点讲述有关Java中面向对象的编程方法。假定读者对基本的编程结构(判断、迭代等)的语法知识已有一个大致的了解,或者至少可以独立地阅读本书。由于Java的许多语法都来自于C语言,因此最好适当地了解一下C语言中的这些编程结构。阅读本书只要求熟悉C语言的基本知识,并不需要是C语言的专家。如果掌握其他静态类型的过程语言(不是C语言),也能够理解本书所讲解的大部分内容。当然,做编程练习至少要求掌握一些基本的Java编程结构。
书中的例子和编程练习并没有假定读者熟悉各种概念,或者具备从经验中产生的直觉(通常仅仅在三年级或四年级的学习中才会出现的)。有些问题来自于常见的图形用户界面(GUI)系统,其他的问题来自于一个关于非常简单的生态系统的模型。任何人只要使用过基于GUI的文档编写系统、电子表格、绘图工具或者类似的内容,就具备了理解这些用户界面的例子和问题的必要条件。对于理解生态仿真的例子也不要求特殊的背景知识。
目的
本书最主要的目的是帮助学习用Java做面向对象的程序设计。尽管书中只描述了Java语言,但是Java所基于的那些面向对象的概念却可以在许多其他的编程语言中实现,这些语言包括C++、Smalltalk和Eiffel。第1章描述了面向对象的主要概念,并没有特别提到Java。来自不同语言和分析方法中的术语也反映出更宽泛的编程环境。例如,下面的术语可以互换使用:“成员函数”、“方法”、“操作”和“动作”。尽管可以对这些术语中做一些区分,但是这些区分对于面向对象编程的入门学生而言并没有实际意义。
本书第二个重要目的是通过强调以下各个方面来提高学生的编程能力:
复用:软件复用的价值在于:在软件陈述、练习和实习中可以一次和多次复用软件。实际上,没有一个练习要求“从零开始”做程序开发。几乎所有的练习都使用了一组现成的类,靠后的章节中还会用到来自Java发布的一个扩展类库。
工具/技术:除了语言特征之外,还给出了开发系统所需要的工具和技术。熟悉语言并写出代码只完成了创建真实系统所需工作的一半(有时还远少于一半)。开发人员还必须进行测试、调试和编写文档。尽管这些思想通常是在更高级的软件工程课程中学习,但这里还是给出了进行更高级学习所需要的基础内容。
GUI库:通过练习和实习,学生们可以学会创建基于GUI系统的面向对象技术。这些技术和后面要介绍的Java Swing工具包将会成为学生要掌握的全部技能的一部分,这些技能在后续课程的编程实习中会用到。这些知识可以帮助你学习其他相似的类库。
事件驱动系统:事件驱动系统是个亮点。初始的程序设计课程通常要处理这样的问题,即所编写的程序在运行时是完全受控的。然而,在事件驱动系统(比如,用户界面、交互式应用程序、操作系统、命令和控制系统)中,程序并没有完全受控。相反,程序是对外部事件做出反应(由外部事件驱动)。学习一些事件驱动系统可以加深体验,拓宽视野,同时提供一种感官上的直觉,有助于今后学习操作系统、计算机体系结构、网络以及类似的包含异步事件的课程。
教学
applet和在线帮助
本书的站点包括了一些交互式的问题和Java applet(小应用程序)。为了使本书的内容更加全面,增加了以下几个内容:
动画:applet提供了一种可视化的表达方式,这种方式比起下面这些方式能够更好地表达概念:静态图、一系列前后相关的静态图或者只是书面描述。这种情况尤其适用于涉及变化或动作的概念。以图形和动画的形式,可以更好地将教师自己头脑中的“景象”传递给学生。
交互:具有主动元素(按钮、菜单等)的applet允许学生按下面的方式来获得对某个概念的(使用)经验:即控制这种经验。尤其是这种形式的applet的价值在于给出了一些关于构造性的、程序设计概念的(使用)经验,而不必关心语法和其他不必要的问题。
反馈:书中包含一些简单的多项选择测试题,可以让学生测试一下自己对所学内容掌握的程度,并增强自信心。这种手段比起课堂内的测验或考试会更有效,并且使心理负担更小。在线提供的问题和applet不仅能更好地表述某些概念,而且有助于创建一个更加适合的学习环境。
jake环境
配合本书的软件包含了一个简单的可视化编程环境,取名为jake。jake环境包含了一些图标,这些图标提供了对本书的例子和习题中用到的一组类的可视化描述。这些类的对象既可以通过直接操纵图标来创建,也可以利用jake中提供的库通过程序来创建。对象之间的关联方式通过在相应的图标之间绘制一条直线来表示。在本书中,jake环境是通过它所操作的所有类来描述的。
习题
几乎每一节的后面都配有一组习题,每道习题都只需很少的时间就能完成。理想情况下,应该在学习下一节之前完成某些习题。甚至可以鼓励教师和学生规定完成习题的时间,按定时的方式尽可能多地做一些习题。习题的设计都符合循序渐进的方式。在这个意义上,这些习题主要是用于帮助学习,而不是用于评价和分级的工具。这些习题都很重要。每道题都涉及某个新的思想。学生如果理解了小节中的内容,那么完成相应的习题就不会花费很多的时间。如果学生对章中的内容有些误解(或者只是想通过实践来更好地掌握概念),那么做习题会很有帮助。
连续的主题作为例子
贯穿全书使用了两个反复出现的例子,这两个例子的主题分别是图形用户界面和生态仿真。例子的连续性使得随着新的概念和技术的引入,可以开发出对问题更完整的解决方案。同时,这些例子也比将不相关的小例子集合在一起要更完整、更真实且更一致。这些例子和问题的设计都是有目的的,都是为了强调程序中的“对象”和“真实世界”中的“实体”之间的关系。例如,第一个编程的习题涉及到在屏幕上显示一个窗口,或者在一个仿真的生态系统中对一个简单的捕食动物的仿真。后面的几个习题涉及到移动和调整窗口大小,以及引入被捕食动物来形成一个捕食动物-被捕食动物模型。在将近3周内,学生要建立一些简单的系统,这些系统包括在图形用户界面中的按钮、定时事件和文本显示,以及在生态仿真中更复杂的场景。这类问题比起更常见的对象如Date、String和Address等更能吸引学生的兴趣。此外,真切地看到窗口如何在屏幕上移动,直接对应于在所创建窗口的类中应用moveTo方法,这样做就加深了理解一个对象是对其真实世界中的实体直接建模。
UML和Swing
随着引入新的面向对象的结构,给出了统一建模语言(UML)中的相应表示。由于UML是一种很大而且复杂的语言,因此本书只描述了它的基本特征。其中包括的UML框图用于类、对象、关联、聚集、界面、顺序、状态迁移和继承。这些内容是UML的核心,并且足以让学生合理地描述复杂的系统。
书中介绍了最新的Swing库(与Java 1.2版本一起引入)。由于Swing是一个丰富而且复杂的库,因此只给出了基本的Swing组件。所给出的组件足以构造出很大范围内的各种有意义的用户界面。给出的内容是进一步研究Swing的基础。利用两个简单的应用程序来举例说明Swing中提供的基本的用户界面控件:一个用于简单的图形绘制工具,另一个用于简单的文本编辑工具。许多编程习题对这两个工具进行了扩展。
独特的组织
本书中的内容是按概念和角色这两种相关的方式来组织的。概念化的组织如第1章中所示,基于下面的四个概念:抽象、分离、合成和概化,这些概念是构筑面向对象的编程语言。第1章先从很高的层次来理解所有这些概念,然后再讲解Java中的详细内容。然而,也可以交叉学习概念及如何在Java中实现这些概念,并且如何利用这些概念来创建系统。
第二种组织方式是按程序员在编程中承担的一系列不同角色进行的。这些角色包括以下几种:
单个现有类的用户:在本书中,单个类表示一个图形用户界面窗口或者捕食动物。在这个简单并且直观的环境中可以自然地给出许多重要的概念(例如重载的方法、构造函数、范围以及静态与动态对象)。注意,从一开始就强调类和对象的重要性。
多个现有类的用户:合成可以看成是通过将交互的对象组合在一起来创建系统。在这一阶段,学生要创建几个小的时间驱动系统,包含配套按钮和文本或者涉及捕食动物和被捕食动物的仿真。
单个类的实现者:只有在这一阶段才揭示出类的内部结构。这里要强调的是,实现者的角色不只是编代码,还包括设计、编写文档、调试以及递增式测试和开发。
多个相关类的实现者:在介绍这个角色的章节中引入了继承,并作为在一组相关的类中共享实现和/或界面的一种机制。
这种组织结构以一种合理并且一致的方式展现了语言特征。每一章集中介绍为了扮演好某个角色而需要学习的内容。
软件
本书例子中用到的全部代码都可以得到。此外,有一个简化的执行环境取名为jake,可以利用它来完成前面部分对图形用户界面习题的编程。这个环境允许构造出简单但有意义的界面,而不必关注于所有底层和分散注意力的细节。这个环境还提供了对程序创建的对象的图形表示以及对这些对象的直接操作。
评论
欢迎对本书提出评论、建议和批评。请发邮件至kafura@cs.vt.edu,或者按下面的地址邮寄:
Department of Computer Science
Virginia Tech
Blacksburg, VA 24061
Dennis Kafura
Blacksburg, Virginia

译者简介

袁晓华:暂无简介

译者序

本书详细地介绍了面向对象编程的基本概念,包括抽象、类、对象、合成、关联、聚集、概化、多态性、继承、重载、覆盖等。提出了一些好的面向对象设计的基本原则,比如一个好的抽象或者一个好的类应该具有的特征等。在描述了这些基本概念的基础上,按顺序逐步介绍了如何利用单个的对象、如何使用不同类的对象、如何实现一个新类以及如何产生一个面向对象的系统。
贯穿全书反复使用了来自两个应用领域中的例子:即图形用户界面和生态仿真系统。按照内容的不断深入,逐步增加和完善这两个例子的功能,使其更接近于实际的开发环境。通过一步一步的指导,使读者熟练掌握利用常见的工具和技术来构造复杂的系统。并且利用了专门的一章来详细介绍用Java中的Swing组件来构造一个用户界面。这样做不仅使读者可以更好地理解面向对象程序设计的实际方法和步骤,同时对于其中的代码只要做一些适当的修改就可以直接应用到实际的开发中。
书中还讨论了各种好的设计策略和软件工程问题,并利用了统一建模语言(UML)来描述各种设计问题和软件工程问题,使读者可以更好地理解和运用UML的技术和方法。书中还较详细地介绍了Java语言的语法和细节,给出的例子代码均是基于Java 2的。本书的最后两章介绍了Java中的输入输出以及并发开发中的线程。
本书英文版在美国是大学本科的教材,概念清晰、讲解透彻,每章,甚至每节都配有思考题和习题,对理解和消化书中的概念极有帮助,特别适合学生和初学者自学参考。
本书的第1、2章由袁晓华翻译,第3、4章由石耀斌翻译,第5、6章由陈虹翻译,第7章由李晓翻译,第8、9章由张睿翻译,全书由袁晓华组织并负责审稿。吴辉、袁源、张斌、冯文武、周涛、黄晓军等人做了部分工作。
由于译者水平有限,翻译中的不妥之处,敬请读者不吝批评指正。


译  者
2002年11月1日于北京

图书目录

第1章  基本概念
1.1  引言 1
1.1.1  面向对象的策略 1
1.1.2  设计策略的定义 1
1.1.3  例子 3
1.1.4  UML设计表示法 3
1.1.5  总的组织 4
1.2  抽象 5
1.3  分离 8
1.4  类、对象和抽象 11
1.4.1  类 12
1.4.2  对象 13
1.4.3  实例化类 14
1.4.4  从类中创建对象 14
1.4.5  抽象界面 15
1.5  合成 17
1.5.1  合成的概念 17
1.5.2  利用关联的合成 19
1.5.3  利用聚集的合成 21
1.6  概化 23
1.6.1  层次性 24
1.6.2  多态性 25
1.6.3  模式 27
1.7  组合在一起 29
1.7.1  与设计策略的关系 30
1.7.2  与软件工程的关系 31
1.7.3  定义小结 33
第2章  使用单个类的对象 34
2.1  引言 34
2.1.1  给类命名 34
2.1.2  创建类的对象 35
2.1.3  UML表示法 37
2.2  类和对象的结构 38
2.2.1  公用部分与私用部分 38
2.2.2  公用界面中的方法 40
2.2.3  GUI窗口的抽象 40
2.2.4  生态仿真中Prey的抽象 42
2.3  在Java应用程序中操作对象 45
2.3.1  将操作应用于一个Prey对象 45
2.3.2  构造并执行一个应用程序 45
2.3.3  一个示例程序 47
2.3.4  UML对象表示法 47
2.4  在一个简单的编程环境中操作GUI对象 49
2.4.1  将操作应用于Frame对象 49
2.4.2  事件和反应式系统 50
2.4.3  一个简单的编程环境 50
2.4.4  Start窗口 52
2.4.5  Simulator窗口 53
2.4.6  示例程序 56
2.4.7  UML对象表示法 58
2.5  命名常量 60
2.5.1  命名常量的作用 60
2.5.2  声明命名常量 61
2.5.3  访问命名常量 63
2.5.4  Prey类中的命名常量 64
2.5.5  命名常量的UML表示法 64
2.6  重载的方法 66
2.6.1  GUI类中重载的方法 66
2.6.2  Prey类中重载的方法 68
2.6.3  UML中重载的方法 68
2.7  Java类中重载的方法 70
2.7.1  交互式I/O中重载的方法 70
2.7.2  输出到窗口的流 72
2.7.3  String类中重载的方法 73
2.8  对象数组 75
2.8.1  声明对象数组 75
2.8.2  在数组中操作对象 78
2.8.3  处理数组 79
2.8.4  二维数组 81
2.9  管理对象 83
第3章  使用不同类的对象 87
3.1  引言 87
3.1.1  复杂信息 87
3.1.2  交互对象之间的相互关系 88
3.2  使用对象传递数据 88
3.2.1  在GUI类中使用对象通信 89
3.2.2  在生态仿真中使用对象通信 95
3.3  交互顺序 101
3.3.1  UML顺序图 101
3.3.2  GUI对象的交互顺序 102
3.3.3  Predator类和Prey类的交互顺序 105
3.4  简单的关联 108
3.4.1  在GUI类中形成关联 108
3.4.2  简单的计数器和计时器 112
3.4.3  在生态仿真中使用关联 114
3.5  界面 118
3.5.1  GUI例子中界面的作用 118
3.5.2  定义一个界面 119
3.5.3  实现一个界面 120
3.6  声明界面类型的参数 122
3.6.1  建立带界面的关联 123
3.6.2  生态仿真例子中的界面 123
3.6.3  实现Hunted界面 125
3.6.4  用Hunted界面声明参数 126
3.6.5  强制类型转换 127
3.6.6  实现多重界面 130
3.7  更复杂的关联 134
3.7.1  复杂用户界面的关联 134
3.7.2  重新组织Frame类和Canvas类 134
3.7.3  生态仿真中更复杂的关联 144
第4章  实现一个新类 151
4.1  引言 151
4.2  实现一个类 152
4.2.1  一般概念 152
4.2.2  一个简单的例子 152
4.2.3  同一个类中方法的调用 154
4.2.4  定义和调用私用方法 156
4.2.5  使用界面变量 158
4.2.6  封装 161
4.3  聚集的作用 162
4.3.1  聚集的概念 162
4.3.2  聚集的优点 167
4.3.3  聚集的类型 167
4.4  简单的静态聚集 168
4.4.1  生态仿真中的聚集 169
4.4.2  共享的子对象 170
4.5  更复杂的静态聚集 172
4.5.1  间接控制 172
4.5.2  实现StopWatch类 174
4.5.3  实现Simulation类 177
4.6  动态聚集 180
4.6.1  使用链表实现动态聚集 180
4.6.2  使用Vector实现动态聚集 184
4.7  “this”变量 187
4.7.1  链式构造函数 187
4.7.2  消除歧义性 189
4.7.3  作为结果返回“this” 189
4.7.4  作为参数传递“this”变量:回调 191
4.8  复制可变对象 193
第5章  产生一个面向对象的系统 199
5.1  引言 199
5.2  设计类 199
5.2.1  发现类设计 200
5.2.2  评价类设计 208
5.3  设计复杂的逻辑 213
5.4  调试 222
5.4.1  差错、缺陷和故障 222
5.4.2  调试工具的作用 224
5.4.3  调试环境 225
5.4.4  调试策略 228
5.5  将相关的类组织成包 231
5.5.1  包的用途 231
5.5.2  创建包 232
5.5.3  引入类 233
5.5.4  储存和查找包 234
5.5.5  限制对包成员的访问 235
5.6  对类编制文档 237
5.6.1  外部文档 237
5.6.2  javadoc工具 238
5.6.3  Javadoc中结构化的注释和标记 240
5.6.4  一个例子 241
第6章  继承 243
6.1  引言 243
6.2  利用继承来共享实现 244
6.2.1  概化两个数字类 244
6.2.2  概化predator和prey的抽象 250
6.3  继承方法和数据 253
6.3.1  用DisplayableNumber类的继承 253
6.3.2  利用Animal类的继承 259
6.4  替换继承的类 264
6.4.1  替换Number类中的一个方法 264
6.4.2  在Predator类中替换一个方法 266
6.5  扩展继承的方法 269
6.5.1  扩展Cycler类的方法 269
6.5.2  扩展Predator类中的方法 271
6.6  隐藏继承的方法 272
6.6.1  问题 272
6.6.2  解决方案 273
6.7  类型强制转换 276
6.7.1  概念 276
6.7.2  利用DisplayableNumber的一个例子 279
6.7.3  Java类库中的类型强制转换 281
6.7.4  利用Animal类的类型强制转换 283
6.8  动态绑定、抽象方法和多态性 285
6.8.1  概念 285
6.8.2  举例 290
6.9  基类的重构 293
6.10  设计类的层次结构 295
6.10.1  基本原则 295
6.10.2  设计类层次结构的一个例子 298
6.11  设计模式 302
6.11.1  设计模式的定义和结构 302
6.11.2  设计模式的一个例子 303
6.11.3  小结 306
第7章  用Java语言创建用户界面 307
7.1  引言 307
7.2  用户界面的结构 309
7.3  两个简单的应用程序 322
7.3.1  DrawTool应用程序 322
7.3.2  EditTool应用程序 328
7.4  事件处理概念 332
7.5  处理简单应用程序中的事件 338
7.5.1  处理DrawTool中的事件 338
7.5.2  处理EditTool中的事件 343
7.6  菜单 347
7.7  复选框 358
7.8  列表 365
7.9  对话框 367
7.9.1  JDialog类 368
7.9.2  JOptionPane类 374
7.10  滚动条 377
7.10.1  利用值选择的滚动条 378
7.10.2  利用滚动条按比例移动 382
7.10.3  利用ScrollPane 385
7.11  文本域 388
7.12  图像 391
7.12.1  利用Image类 391
7.12.2  利用ImageIcon类 399
7.13  布局管理器 400
7.13.1  BorderLayout 401
7.13.2  FlowLayout 403
7.13.3  GridLayout 405
7.13.4  CardLayout 407
7.13.5  GridBagLayout 410
7.13.6  组合几个布局管理器 417
第8章  Java中的输入/输出 421
8.1  引言 421
8.1.1  输入/输出的复杂性 421
8.1.2  Java输入/输出模型 422
8.1.3  文本和二进制流I/O类的模式 422
8.1.4  Book例子 424
8.1.5  章的组织 425
8.2  二进制输入/输出 426
8.2.1  Java类 426
8.2.2  一个例子 428
8.3  文本输入/输出 432
8.3.1  Java类 432
8.3.2  一个例子 434
8.3.3  交互式输入/输出 441
8.4  随机存取文件输入/输出 444
8.4.1  概念 444
8.4.2  RandomAccessFile类 445
8.4.3  Book例子 445
8.5  对象输入/输出 449
8.5.1  Java类 449
8.5.2  Book文件例子 451
8.6  输入/输出过滤 453
8.6.1  概念 453
8.6.2  Java类 454
8.6.3  一个例子 455
第9章  线程 458
9.1  引言 458
9.2  独立线程 459
9.2.1  Thread类 459
9.2.2  一个例子 460
9.3  同步线程 465
9.3.1  同步的概念 465
9.3.2  线程状态 465
9.3.3  线程组 475
9.4  分布式并发 475
9.4.1  概念 478
9.4.2  套接字 480
9.4.3  EcoSim例子 483
索引 493

教学资源推荐
作者: H.H.Tan,T.B.D'Orazio,S.H.Or,Marian M.Y.Choy著
作者: [美] 埃里克·伽玛(Erich Gamma) 理查德·赫尔姆(Richard Helm) 拉尔夫·约翰逊(Ralph Johnson) 约翰·威利斯迪斯(John Vlissides) 著
作者: 凌云 谢满德 陈志贤 吴海燕 编著
作者: Patrick Henry Winston, Sundar Narasimhan
参考读物推荐
作者: 黄灯桥 徐会生 著
作者: Bjarne Stroustrup