本书从解决实际问题的角度讲解Java面向对象程序设计,提供了健壮而灵活的问题求解方式,有助于读者了解对象的抽象原则,掌握对象的交互概念以及各种方法的使用。书中首先采用“从对象开始”的方式引导读者,在引入大多数程序设计基本特性和结构化程序设计概念之前,先介绍设计对象和方法的基础知识。本书重点关注问题分解和问题设计,并采用了分而治之和逐步求精的原则。这种方式与大量的习题以及实验题相结合,为读者提供了理论与实践的最佳结合方案。另外,书中也讲解了Java高级特性,如GUI组件(AWT和Swing)、异常、线程、文件和套接字等。全书的组织风格便于教师根据初学者的接受能力和课时安排选讲适当的高级主题。
本书适合作为高等院校计算机专业或相关专业的Java程序设计或面向对象程序设计课程的教材,也非常适合专业技术人员作为参考书。
第0章 计算机、对象与Java
0.1 欢迎
0.2 为什么学习编程
0.3 为什么学习Java
0.4 什么是计算机
0.5 Internet与万维网
0.6 编程语言
0.7 什么是面向对象编程
0.8 UML要素小结
0.9 小结
0.10 习题
第1章 Java程序设计与开发
1.1 简介
1.2 设计优秀的程序
1.3 Java语言小结
1.4 编辑、编译与运行Java程序
1.5 Java中的限定名称
1.6 实验课:编辑、编译与运行applet
1.7 小结
1.8 自测题答案
1.9 习题
第2章 对象:定义、创建和使用
2.1 简介
2.2 类定义
2.3 实例分析:模拟CyberPet
2.4 实验课:Circle类
2.5 Java 语言小结
2.6 小结
2.7 自测题答案
2.8 习题
第3章 方法:与对象进行通信
3.1 简介
3.2 传递信息给对象
3.3 构造方法
3.4 从对象获取信息
3.5 传值与传引用
3.6 控制流程:选择控制结构
3.7 改进的CyberPet
3.8 实验课:养宠物CyberPet
3.9 Java语言小结
3.10 小结
3.11 自测题答案
3.12 习题
第4章 applet: World Wide Web编程
4.1 简介
4.2 Applet类
4.3 类继承
4.4 Applet的子类
4.5 一个简单的applet
4.6 事件驱动的程序设计
4.7 实例分析:CyberPetApplet
4.8 实验课:CyberPetApplet
4.9 Java语言小结
4.10 小结
4.11 自测题答案
4.12 习题
第5章 Java数据和操作符
5.1 简介
5.2 程序设计=表示+动作
5.3 布尔数据与操作符
5.4 基于布尔类型的CyberPet模型
5.5 数值数据与操作符
5.6 实例分析:把华氏温度转换成摄氏温度
5.7 基于整数值的CyberPet模型
5.8 字符数据与操作符
5.9 例子:字符转换
5.10 例子:计算复利
5.11 问题求解 = 表示+动作
5.12 实验课:闰年问题
5.13 Java语言小结
5.14 小结
5.15 自测题答案
5.16 习题
第6章 控制结构
6.1 简介
6.2 流程控制:循环结构
6.3 计数循环
6.4 例子:汽车贷款
6.5 条件循环
6.6 例子:计算平均值
6.7 例子:数据校验
6.8 实例分析:动画CyberPet
6.9 循环设计的原则
6.10 实验课:找质数
6.11 Java语言小结
6.12 小结
6.13 自测题答案
6.14 习题
第7章 字符串与字符串处理
7.1 简介
7.2 String基本知识
7.3 字符串查找
7.4 例子:关键字查找
7.5 检索字符串中的一部分
7.6 例子:处理名字与口令
7.7 处理字符串中的每个字符
7.8 实例分析:CyberPet的字符串把戏
7.9 比较字符串
7.10 实验课:暗语翻译
7.11 Java语言小结
7.12 小结
7.13 自测题答案
7.14 习题
第8章 数组与数组处理
8.1 简介
8.2 一维数组
8.3 简单数组举例
8.4 例子:测试掷骰子
8.5 实例分析:CyberPet动画
8.6 数组算法:排序
8.7 数组算法:查找
8.8 二维数组
8.9 多维数组
8.10 实例分析:模拟纸牌
8.11 实验课:纸牌游戏程序
8.12 Java语言小结
8.13 小结
8.14 自测题答案
8.15 习题
第9章 图形用户界面
9.1 简介
9.2 Swing组件集
9.3 Java事件模型
9.4 实例分析:设计一个基本GUI
9.5 容器与布局管理器
9.6 复选框、单选钮与边框
9.7 菜单和滚动窗格
9.8 实验课:ATM机
9.9 小结
9.10 自测题答案
9.11 习题
第10章 图形与绘图
10.1 简介
10.2 绘图表面
10.3 图形上下文
10.4 Color类
10.5 绘制线条和图形
10.6 例子:ShapeDemo applet
10.7 图形方程
10.8 绘制条形图和饼图
10.9 在图形上下文中处理文本
10.10 实例分析:交互绘图
10.11 实验课:SelfPortrait类
10.12 小结
10.13 自测题答案
10.14 习题
第11章 异常处理
11.1 简介
11.2 处理异常情况
11.3 Java的异常层次结构
11.4 在程序中进行异常处理
11.5 错误处理和强健的程序设计
11.6 创建并抛出自己的异常
11.7 实验课:测算异常的开销
11.8 Java语言小结
11.9 小结
11.10 自测题答案
11.11 习题
第12章 递归问题求解
12.1 简介
12.2 递归定义
12.3 递归字符串方法
12.4 数组的递归处理
12.5 例子:绘制递归的分形
12.6 实验课:RecursivePatterns applet
12.7 小结
12.8 自测题答案
12.9 习题
第13章 线程和并发编程
13.1 简介
13.2 线程
13.3 线程状态和生命周期
13.4 使用线程来改进界面的响应
13.5 实例分析:协调各线程
13.6 实例分析:Spider和Fly线程
13.7 实验课:蜘蛛、苍蝇和蜜蜂
13.8 小结
13.9 自测题答案
13.10 习题
第14章 文件、流和输入/输出技术
14.1 简介
14.2 流和文件
14.3 实例分析:读写文本文件
14.4 File类
14.5 例子:读写二进制文件
14.6 对象的序列化:读和写对象
14.7 实验课:TextEdit程序
14.8 小结
14.9 自测题答案
14.10 习题
第15章 套接字和网络
15.1 简介
15.2 网络概述
15.3 从applet中使用网络资源
15.4 放映幻灯片的applet
15.5 在应用程序中使用网络资源
15.6 通过socket进行客户/服务器通信
15.7 实例分析:通用客户/服务器类
15.8 Java网络安全限制
15.9 实验课:因特网CyberPet
15.10 小结
15.11 自测题答案
15.12 习题
第16章 数据结构:列表、栈和队列
16.1 简介
16.2 链表数据结构
16.3 栈ADT
16.4 队列ADT
16.5 实验课:资本收益
16.6 小结
16.7 自测题答案
16.8 习题
附录A 编码约定
附录B Java开发工具
附录C ASCII与Unicode字符集
附录D Java关键字
附录E 运算符的优先级结构
附录F Java语言高级特性
附录G Java和UML资源
任何程序员都应该熟悉Java,无论你曾经是一位系统程序设计大师,还是一位擅长快速原型法的数据库应用程序设计师,或者仅仅是一位刚刚踏入程序设计之门的初级程序员。从最初为嵌入式程序而设计的语言到现在特别适合Internet程序设计的语言,Java已经不可逆转地成为Internet时代的主流程序设计语言之一。
本书最令人心动之处莫过于它能给不同的程序员从不同的角度提供帮助。本书没有对读者做任何不合理的假定,而是尽量适合几类读者:初学编程的新手、C/C++程序员以及其他各种伟大或者平凡的语言的使用者。正因为如此,本书非常适合作为一本入门教材。
作者把极为广博的知识融入本书,为读者学习Java提供了全面而且实用的指导。在强调面向对象的同时并没有忽视语言细节,通过各种重要提示反复提醒读者应该注意的内容,包括语法、语义、调试和测试等。另外,每章的Java语言小结、Java库类、实验课、自测题以及习题,都有助于读者在学习过程中巩固知识并提高实际编程能力。
“从对象开始”使本书免于俗套。确实,它能让一个初学程序设计的新手很快对面向对象这个激动人心的概念有一个总体印象。这也是许多C程序员在转向C++时难过的一关。C++最大的优点在于它既可以是面向对象的,也可以是面向过程的。初看起来,C++提供了从面向过程到面向对象的平滑过渡,但也正是因为这一点,许多C程序员学习C++或者用C++编程达半年以上却仍然未能清楚地理解“面向对象”的真实内涵。本书在深入Java语言的语法与语义细节之前用尽可能浅显的语言和例子清晰而形象地向读者展现了面向对象的概念,使读者在尚未真正开始学习Java之前就能对面向对象程序设计有鲜明的感性认识。而本书的后续内容也一直不遗余力地不断强化面向对象程序设计中的各个关键主题。学完本书,读者真正能够达到一个目标:学会用Java进行面向对象程序设计。
本书的另一新颖之处是有配套的Web站点www.prenhall.com/morelli/,其中包括教学的辅助资源以及本书的代码下载。另外,在书中文字以及代码例子中多处涉及了http://starbase.trincoll.edu/,即作者所在的Trinity College的网站,从这里同样可以浏览或下载本书的代码。但是,译者尝试后发现,可能由于网站内容的调整,个别代码或链接可能会失效。如果出现这种情况,请尝试采用http://starbase.cs.trincoll.edu/。
本书前言、第0章到第9章由董永乐翻译,第10章到第16章由陈康与缪国往初译,附录由吴嫣翻译。陈渝老师修改了初译稿并对全书内容进行了整理和统校,段海新、钱芳、于洁阅读了译稿并提出了宝贵的修改意见。张少华、姜进磊、许超、杨武勇、钱俊、张力也参予了翻译工作,在此一并表示感谢。限于译者水平,译文中的疏漏和错误在所难免,欢迎读者批评指正。
本书读者对象
本书覆盖的内容和采用的讲解方式适用于典型的计算机科学入门(CS1)课程,或者内容稍深的Java语言课程。本书也非常适用于那些转向Java与面向对象编程的专业程序员。
本书采用一种“从对象开始”的方法讲述编程与问题求解,既不要求读者有任何编程经验,也不需要读者事先具备任何Java或面向对象编程的知识。
第二版的新增内容
本书第二版在如下方面有重大改进:
● 统一建模语言(UML)。UML框图贯穿全书,以帮助阐述面向对象的概念,描述我们开发的Java程序的设计过程。第一版中的许多流程图现在已经用UML框图代替了,同时添加了很多新的UML框图。
UML正在迅速发展成为设计面向对象程序的业界标准,所以熟悉它会非常有用。但是,使用UML的主要原因还是出于教学上的考虑,这样更容易介绍和讲授信息隐藏、继承以及多态性等面向对象的概念。
● 强调面向对象设计。第二版更多地强调了面向对象设计,这种变化大部分体现在开发书中涉及的例子的过程中。重新编写了许多编程例子,以便在深入Java编码细节之前重点关注设计。使用UML框图有助于采用这种方式。
● 改变了内容的组织结构。根据前一版的评阅者和用户的建议,本书有几章的内容进行了调整。前两章进行了大幅度改写。第0章现在提供了更详细的面向对象的概述,并且介绍了UML的主要特点,这样有助于在深入讨论Java的面向对象实现之前给学生以正确的方向指导。为了强调设计相对于编码的重要性,第1章在介绍Java代码之前重点讲述程序设计与开发。这一章中还包括了对基本的Java语言特性的简要概述。这样,学生们在开始学习具体的Java例子之前就有了很好的总体认识。
关于Java语言要素的组织,本书把switch语句的讨论移到了第3章,与其他的选择控制结构一起讨论。本书还改写了第11章,以便在课程中更早、更容易地使用它。
为什么从对象开始
本书从对象开始讲授Java,早一些给初学者总体印象,让他们有更多的时间来掌握面向对象编程的原理。
我第一次在CS1课程中讲授Java时,使用的是讲授C和C++时所用的方法,即从基本的语言特性和结构化编程的概念开始,然后在课程中期的某个时候开始介绍面向对象。这种方法是大家都很熟悉的,因为大多数Java与C++教材都使用这种方法。
这种方法的一个问题是很多学生都得不到一个总体印象。他们能弄清楚循环、if-else结构以及算术表达式,但很难把一个编程问题分解成结构良好的Java程序。另外,这种过程化的方法似乎无法利用Java面向对象的强大功能的优势。如果要用对待C或者Pascal的方式来对待它,那么为什么还要讲授面向对象的语言呢?
这样也使我想起来当Pascal是流行的CS1课程时的相似情况。当时,初学者最大的障碍就是过程抽象,即学习过程调用与参数传递的基本机制,学习如何将程序设计成一系列过程的集合。“Oh! Pascal!”是我最喜欢的入门书籍,该书采用的就是典型的“从过程开始”的方式。在第1章中讲述了赋值与I/O结构之后,紧接着就在第2章中讲述过程与参数。然后,第3章开始讲述程序设计与组织方式。直到第4章及以后才开始讲述循环、if-else以及其他结构化编程的概念。
现在,初学者的主要障碍在于“对象抽象”。新手程序员必须能把程序看成多个相互作用的对象的集合,而且必须学会如何将编程问题分解成多个设计良好的对象。面向对象同时包容了来自Pascal时代的过程抽象与结构化编程的概念。“从对象开始”的讲授方式自顶向下讲清楚了这3个重要的概念。越早介绍对象和类,学生越能更好地掌握面向对象的重要原则。
面向对象(OO)是一种基本的问题求解与设计的概念,而不仅仅是另一个应该归入教材(或课程)的中后期的语言细节。如果很晚才介绍OO的概念,就非常容易在课程进度紧张时将其略过。
Java是一种非常适合介绍面向对象概念的语言。它的对象模型比C++组织得更好。在C++中,很容易绕过OO的特点并把它当成C来对待。在Java中,有很好的机会来激发关于面向对象的讨论。例如,几乎不可能不讨论继承和多态性就讨论applet。这样,教师可以用Java的某些基本特点,如applet,类库和GUI组件,自然而然地引发这些讨论,而不必另外准备一些使用OO概念的例子。
主要特点
除了“从对象开始”的方法之外,本书还有其他几个重要特点:
● 统一建模语言(UML)框图。200多个UML框图贯穿全书,用于解释面向对象的概念,并重点关注面向对象设计。使用UML框图有如下几方面的优势。首先,UML框图提供了一个简要描述类和对象的主要特性的可视化方式。读者很容易看到一个对象的属性和方法,它们是私有的还是公共的,这个类或对象与其他的类之间的关系是什么。第二,UML框图为重要的面向对象概念(如继承和多态性)提供了简单的图形模型。一幅图可以替代许多文字,所以除了文字描述之外,UML框图有助于学生们理解这些重要的概念。第三,就其在本书中的使用目的而言,UML理解起来相对容易一些并且非常直观。第0章中用浅显易懂的例子介绍了基本的标记法。最后,UML正在迅速成为业界标准。所以,通过本书熟悉UML可以更好地读懂其他关于Java与面向对象设计的书籍。
● CyberPet例子。CyberPet类贯穿全书,作为一个能够运行的例子来阐述并加强重要的概念。CyberPet在第2章中以一种拟人的方式展示了对象的基本特征。每个CyberPet属于一个类(定义),有某个状态(实例变量),能够执行类似吃和睡(实例方法)这样的行为。方法调用用于命令CyberPet吃和睡。在第3章中,着重讲解了定义和使用方法与参数,与CyberPet进行通信。在后续章节中,通过CyberPet阐述了继承、随机性、动画和线程等概念。一些实验和编程练习也在丰富CyberPet的行为并使之更加复杂。
● applet与GUI。applet与GUI在第4章中首次引入,并在后续章节中一直使用。显然,applet是学生入门的诱饵并且可以作为一种很好的激励因素。另外,事件驱动编程(event-driven programming)与图形用户界面(GUI)是学生们应该在CS1课程中学习的。我们早已过了那个把命令行界面作为设计应用程序的标准的时代。Java applet的另一个优势是它们从根本上讲是面向对象的。要想全部掌握applet,学生们需要理解基本的OO概念,这也正是直到第4章才讲授applet的原因。第4章中以一种很好的方式促进了关于继承与多态性的讨论。
● 配套Web站点。本书设计成和一个包括许多有用资源的配套Web站点配合使用。这些资源包括书中所有例子的Java代码和Java文档(HTML格式),补充的实验与编程作业,自动评分的在线测验以及PowerPoint教案(部分资源为收费使用——编者注)。关于提供给教师的辅助教学资源,详见本书末尾的“教学支持说明”。
● 问题求解方法。全书采用问题求解教学方法,共有13个完整地开发好的“实例分析”,以及其他用于阐述这种问题求解过程的大量例子。
● 自测题。全书包括200多个自测题,答案在每章最后给出(位于章末习题之前)。
● 章末习题。全书一共提供了400多个章末习题,其中还有很多标明为“难题”。采用本书作为教材的教师可以得到包含习题答案的教师手册(详见本书末尾的“教学支持说明”)。
● 编程、调试与设计技巧。本书包含了近400个单独标记的“技巧”(编程技巧、调试技巧、高效设计原则以及Java语言规则),言简意赅地给出了关于编程与设计的有用信息。
● “实验课”小节。从第1章开始,每一章都包含实验课内容,非常适合有实验环节的CS1课程。对于那些没有实验环节的CS1课程,这些小节也可以用于准备编程作业,作为课堂上的演示或者作为其他形式的实践作业。书中的每个实验在配套的Web站点上都有补充资源和讲义,还提供了可供选用的实验作业。
● “Java库类”小节。从第1章开始,每一章都介绍了一个或多个来自Java API(Application Programming Interface)的库类。在前面的几章中,这些小节用来介绍编写简单程序所需的工具,如I/O类与方法。在后面的几章中,一些小节用来介绍有用的选读内容,如用于格式化数字输出的NumberFormat类,另外一些用来介绍程序例子和实验课中涉及的基本GUI组件。
● “面向对象设计”小节。从第1章开始,每一章都有一个关于面向对象设计的小节,强调并详述继承、多态性与信息隐藏之类的重要概念。表1为那些希望强调面向对象设计的教师提供了应该讲授的章节的清单。
● “Java语言小结”小节。介绍语言特性的几章中都包含了这个小节,以总结这些语言特性的基本语法和语义。
表1 有关面向对象的章节
主题 章节
什么是面向对象 0.7节
UML概述 0.8节
面向对象的设计过程 1.2节
对象:定义、创建和使用 第2章
方法:与对象通信 第3章
继承:toString( )方法 第3章,“面向对象设计”小节
applet中的继承与多态性 4.2节至4.4节
继承与多态性:ToggleButton 第4章,“面向对象设计”小节
信息隐藏 第5章,“面向对象设计”小节
结构化编程概念 第6章,“面向对象设计”小节
抽象类:Cipher 第7章,“面向对象设计”小节
多态性:多态排序 第8章,“面向对象设计”小节
(续表)
主题 章节
模型-视图-控制器架构 第9章,“面向对象设计”小节
继承与多态性:Spider/Fly类 13.6节
通用Client/Server类 15.7节
抽象数据类型:List类 第16章,“面向对象设计”小节
内容组织
从总体上讲,全书可以划分成三个部分。第一部分(第0章到第4章)介绍面向对象的基本概念,包括对象、类、方法、参数传递、信息隐藏、继承以及多态性。虽然这几章的重点在于面向对象而非Java的语言细节,但也都包含“Java语言小结”小节,总结了涉及到的语言要素。
在第1章至第3章中,给学生提供了从最初的想法构造Java程序的基本程序块。虽然就控制结构与数据类型而言,在这个阶段的程序功能很有限,但其重点在于如何构造对象,以及如何通过方法调用和参数传递与其他对象交互。
第二部分(第5章到第8章)重点关注其余语言要素,包括数据类型和操作符(见第5章)、控制结构(见第6章)、字符串(见第7章)和数组(见第8章)。当学生们理解了面向对象程序的基本结构与框架之后,讲授这些语言特点相对而言会容易一些。
第三部分(第9章到第16章)讲解了各种高级内容,包括图形用户界面(见第9章)、图形(见第10章)、异常(见第11章)、递归(见第12章)、线程(见第13章)、文件(见第14章)、套接字和网络(见第15章)以及数据结构(见第16章)。教师可以根据学生的兴趣有选择地讲解这几章的内容。
表2中的课程提纲取材于作者的一学期CS1课程(一学期为13周,加上一个不上课的阅读周)。
表2 一学期的课程安排
周 主题 章
1 面向对象,UML 第0章
程序设计与开发 第1章
2~4 对象和类定义 第2章
方法和参数 第3章
选择结构(if-else)
5 applet编程 第4章
继承
6 数据类型与操作符 第5章
7~8 控制结构(循环) 第6章
结构化编程
9 字符串处理(循环) 第7章
10 数组处理 第8章
11 递归 第12章
12 高级内容(GUI) 第9章
13 高级内容(异常) 第11章
高级内容(线程) 第13章
注意,这几章高级内容并不需要按顺序讲解。递归(见第12章)可以和循环(见第6章)一起讲,甚至可以在循环之前讲。递归这一章包括一些使用字符串、数组和绘制算法(分形)的例子,以及一些标准数值算法(阶乘)的例子。讲解递归的另一种方法是和字符串(见第7章)、数组(见第8章)以及图形(见第10章)一起讨论,这样就可以同时讲解递归和循环迭代。
异常(见第11章)也可以早一些讲。这一章的前几节中的例子使用了简单的算术运算符和基本的for循环。如果单独介绍这些语言要素,可以紧接在第3章之后讲解异常。
在有关高级内容的那几章中,有些例子用到了applet(见第4章)和GUI(见第9章),所以这些章节在第10章(关于图形)、第13章(关于线程)、第14章(关于文件)以及第15章(关于套接字和网络)之前讲较为理想。然而,第16章(关于数据结构)与其他高级内容的讲解可以独立于applet和GUI。图1给出了书中各章的主要依赖关系。