前 言
《Java面向对象程序设计》(第3版)是为计算机科学经典入门课程或以Java作为第二门语言的课程而设计的。这一版保持了前两版“从对象开始”的方法讲述编程和求解问题的特点。贯穿整本书,我们强调尽可能全面细致地覆盖Java语言的特点、基本的编程概念和面向对象设计的原则。
第3版保留了前两版的以下特征:
* 以介绍对象开始
* 强调面向对象设计(Object Oriented Design,OOD)
* 统一建模语言(Unified Modeling Language,UML)图示
* 自测题及答案
* 编程、调试及设计技巧
* Java库成员
* “面向对象设计”部分
* 章末练习
* 配套网站提供PowerPoint幻灯片和其他资源
前两版的实验部分已经移至本书配套网站。
第3版新增内容
第3版有以下显著的变化。
* 尽管本书仍然强调实例,在好几章中仍然可见到前版的例子,然而CyberPet类例子已经被一系列游戏和难题类的例子所取代。不过前两版的CyberPet类例子仍然可以在本书配套网站上找到。
* 我们重新组织了第0章和第1章,并进行了大量的修订。在编排上,新版采用更加循序渐进的方法引入新的概念。新版在编排上放慢了介绍新概念的步伐。关于面向对象(OO)和UML概念的处理也简化了,一些更具有挑战性的OO主题,比如多态性,安排在新增的第8章。
* 第2章引入了新的Java 1.5 Scanner类,用于执行简单的输入操作。
* 第4章单独介绍命令行界面和图形用户界面(GUI)。教师可以选择更符合自己教学风格的界面。命令行界面基于BufferedReader类并且贯穿后面的章节。GUI适用于图形应用或applet。两种方式都能很好地突出用户界面设计的基础。章末用一个可选的部分来使用新的类Scanner,以此介绍文件I/O。
* 继承和多态性的讨论集中安排在第8章。
* 第15章包含近来出现的更高级的Java技术,包括servlet和Java Server Page。
* 第16章重新强调怎样运用数据结构。它更多地使用Java的集合框架,包括LinkedList和Stack类以及List界面。它已经扩展为包括一些高级的数据结构,比如集合、图和二叉查找树。
* (CodeKey和各章练习集成在一起!)CodeKey是一种在线交互的编程教程,用来突出Java的编程概念和技术。在练习编号前的CodeKey图标表示在练习末尾包含CodeKey部分。使用CodeKey,学生能够收到他们所写的代码的自动反馈,并且老师可以很容易地控制作业和学生的进度。在线CodeKey练习能够使学生在交作业前测试程序。教师可以在任何时候轻松地在线跟踪个人和班级的编程尝试和表现。如果必要,CodeKey提供提示来改进和调试代码。学生会收到错误警告和编程提示来改正错误。CodeKey是Morelli和Walde所使用的另一种方式,使编程更容易、有趣和便于管理!
为什么从对象开始
第3版仍采用首先引入对象的概念这一方式来讲授Java,以便尽早给初学者一个总体印象,让他们有更多的时间来掌握面向对象编程的原理。随着越来越多的老师开始欣赏从面向对象的角度来讲授,这种讲授方法变得非常流行。
面向对象(OO)是一种基于问题求解与设计的观念,而不仅仅是另一个应该归入教材(或课程)中后期的语言细节。如果很晚才介绍OO的概念,非常容易在课程进度紧张时将其 略过。
我们第一次在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个重要的概念。越早介绍对象和类,学生就越能更好地掌握面向对象的重要原则。
Java是一种非常适合介绍面向对象概念的语言。它的对象模型比C++组织得更好。在C++中,很容易忽略OO的特点并把它当成C来对待。在Java中,有很好的机会来激发关于面向对象的讨论。例如,几乎不可能不讨论继承和多态性就讨论基于GUI的applet。这样,教师可以用Java的某些基本特点,如类库、Swing和GUI组件,自然而然地引发这些讨论,而不必另外准备一些使用OO概念的例子。
本书的组织结构
本书分为3部分。第Ⅰ部分(第0章~第4章)介绍面向对象的基本概念和Java语言的基本特点;第Ⅱ部分(第5章~第9章)关注其余语言要素,包括数据类型,控制结构,字符串和数组处理,继承和多态性。第Ⅲ部分(第10章~第16章)讲述各种高级的内容,包括异常,文件I/O,递归,GUI,线程和并发编程,套接字和网络,数据结构,servlet和Java Server Pages。
前两部分覆盖了一般的CS1入门课程的内容。第Ⅲ部分各章自成体系,如果时间允许,可以加在CS1课程的末尾。
第Ⅰ部分(第0章~第4章)介绍面向对象的基本概念,包括对象、类、方法、参数传递、继承和多态性。这几章主要集中引入一个基本概念,即面向对象编程是一组对象间相互交流与合作来解决问题的集合。在介绍Java语言要素时根据需要加强这种概念。学生将从基础出发,学习编写Java程序的基本技能和方法。
尽管前几章的程序就控制结构和数据类型而言有一定的局限性,但其侧重于对象的构造,以及它们怎样通过方法调用和参数传递来相互作用。
第Ⅱ部分(第5章~第9章)重点关注其余语言要素,包括数据类型和操作符(第5章)、控制结构(第6章)、字符串(第7章)和数组(第9章)。还详细讲述了面向对象的主要机制,即继承和多态性(第8章)。
第Ⅲ部分(第10章~第16章)讲述一些高级的内容。教师可根据学生的兴趣选择性地讲解这几章的内容。
本书通过一些简单、易懂的例子来讲述这些关键概念。很多概念被用来生成一些游戏例子,这些例子贯穿全书。我们的教学方式聚焦于设计。程序示例是在强调面向对象的原则的基础上发展而来的,而不是以语言的细节开始的。
下表是以我们一学期的CS1课程为例的课程表。一学期为13周(加上一周不上课的阅读时间)。在最后两周,我们将根据学生的兴趣和技能水平选择性地介绍高级主题。
一学期的课程安排
周 主题 章 1 面向对象,UML
程序设计和开发 第0章
第1章 2~3 对象和类的定义
方法和参数
选择结构(if-else) 第2章
第3章 4 用户界面和I/O 第4章 5 数据类型和操作符 第5章 6~7 控制结构(循环)
结构化编程 第6章
续表
周 主题 章 8 字符串处理(循环) 第7章 9 继承和多态性 第8章 10 数组处理 第9章 11 递归 第12章 12 高级主题(异常) 第10章 13 高级主题(GUI) 第11章 高级主题(线程) 第15章
??
??
??
??
VI
Java面向对象程序设计(第3版)
V
前言