Java面向事件编程

Java面向事件编程"

作者:杨战伟
ISBN:9787302144663
定价:¥69
字数:千字
页数:
出版时间:2007.02.01
开本:
版次:1-1
装帧:
出版社:清华大学出版社
简介

本书旨在帮助学生首先掌握对象和事件——这样他们很快就可以开始使用Java来完成一些重要的编程任务。

本书由计算机科学教育领域的三位顶级专家编写,其中包括2005年SIGCSE奖得主Kim Bruce,这几位专家从根本上重新思考了究竟该如何讲授Java以及其他面向对象语言这一问题,本书正是他们共同努力的结晶。为了给学生提供“训练车轮”,他们需要尽早开始使用复杂的Java特性,本书作者引入了一个完整的面向对象图形库。使用该库时,学生可以立即着手编写简单的图形和动画程序,而且能够看到他们所编写代码的实际结果。与传统教学方式相比,学生能够更快地了解核心的Java特性,而且在具有必要的知识储备后,可以快速掌握一些诸如并发之类的强大Java特性。

本书的对象优先方法、内容和特点已经在世界上许多顶级大学、四年制学院和两年制学院的教学实践中系统地得以证实。这些特点包括:

l 牢牢着眼于使用GUI组件的事件驱动的编程:学生通过体验单击环境来认识编程的方式

l 逐步、完整地涵盖所有典型的基础知识,包括数组、字符串、递归、文件、排名、搜索、继承性等

l 一种讲授异常的有效方式

l 一个有关面向对象设计基础知识的初级读本。

l 每章中间都包含有习题,用于评估学习进度

l 每章末尾具有复习题和编程题,强化在该章学习的关键概念和技术

l 附录解释了如何浏览并阅读Java API

关于作者——放勒口上

Kim B.Bruce是波莫纳学院的计算机科学教授,他从麦迪逊的威斯康星大学获得博士学位,曾在威廉斯学院和普林斯顿大学任教。他还在一些国家级的计算机科学课程委员会担任职务,并且由于在计算机科学教育领域做出的突出贡献而获得2005 SIGCSE奖。

Andrea Pohoreckyj Danyluk是威廉斯学院的计算机科学副教授,她从哥伦比亚大学获得博士学位,并曾为ACM/IEEE计算课程特别工作组做出过贡献。

Thomas P. Murtagh是威廉斯学院的计算机科学教授,他从康奈尔大学获得博士学位,并曾任教于珀德尤大学。他曾经出版过计算机科学教学法和课程设计,以及有关编译器优化到操作系统设计等方面主题的论著。

前言

基于Java的基础课程给教师和学生都提出了新的挑战。虽然Java要比C++简单,但Java作为一种具有大量标准库的面向对象语言这一事实既带来了新的复杂性,同时也带来了新的机会。

本书作为计算机科学基础教材,提供了一种新的Java编程教学方式,它具有以下一些特点:

1. 一种对象优先的编程方式

2. 大量使用面向对象的图形

3. 尽早使用并发

4. 从一开始就使用事件驱动的编程

初看上去,以上主题列表对于基础性课程而言显得有点不堪重负,但是这些特性的协同效应可以在介绍Java编程时获得令人惊讶的良好效果,尤其是当使用我们开发的objectdraw库时会更有帮助。

目标读者

本书的主要目标读者是计算机科学专业的大学一年级本科生、对编程感兴趣的其他专业的大学生,以及学习计算机科学预修课程的高中学生。特别值得一提的是,本书涵盖了AP A考试内容。

写给学生

神秘的漂亮口号

在本序言开头列出了本书中我们认为特别令人兴奋的一些特点。它们是:

1. 一种对象优先的编程方式

2. 大量使用面向对象的图形

3. 尽早使用并发

4. 从一开始就使用事件驱动的编程

此时你可能想知道这些漂亮的口号究竟意味着什么。

Java是一种面向对象(object-oriented)程序设计语言的例子。就像人类社会具有许多不同类型的语言一样,计算机语言同样存在各种不同的类型。面向对象编程语言只是一种计算机编程语言。由于编程语言各有不同,因此应当按照不同的方式来进行教学。由于Java是面向对象的语言,因此我们打算按照一种适合该语言特点的方式来介绍它。

从本书一开始,将学习如何编写涉及简单图形的程序--例如:矩形、椭圆、直线等。甚至还将学习使用并发(concurrency)机制编写可以创建图形动画的程序。我们发现学生和教师都喜欢编写那些涉及简单而有趣的图形的程序。除了可以给人带来乐趣之外,图形还非常具体直观。当程序在窗口中绘制和操作图形对象时,可以实际了解到程序正在进行的工作。我们发现这一点对于初学编程的人很有帮助。

此外我们还尽早介绍了事件驱动的编程(event-driven programming)。尽管也许你没有听说过"事件驱动的编程"这一名词,但是很可能已经对此有所熟悉。如果通过拉下菜单、单击图标,或者使用鼠标拖放项目等方式和计算机交互,实际上就是在和事件驱动的程序交互。你将要学习编写的这种程序允许用户通过鼠标移动、按钮、滚动条等组件来与它们交互。

如何阅读本书

对于学习编程而言,实践是相当重要的一个组成部分。因此,在阅读本书时,其中提供了许多实践机会。每一章都包含有习题,可以让你检验自己是否理解了书中的内容。在阅读本书时带上纸和笔,这样在一边学习时可以一边完成简短的习题作业。此外,在每一章的末尾,都会看到该章的复习题以及编程题。完成这些复习题有助于确定自己是否理解了该章介绍的主要概念。在觉得自己对这些习题有把握之后,再尝试完成编程题,做过的习题越多,学习Java语言的效果就越好。

写给教师

本书的特点

一个针对对象优先教学方式的图形库

在本书的第一个例子中使用了图形,并且构建了一个真正的面向对象图形类库。我们相信图形对于介绍面向对象编程是一个很好的基点,原因有以下一些。

首先,图形是良好的对象示例。图形类(例如,带有边框和填充的矩形和椭圆)提供了良好的对象示例,因为它们具有形状(位置和大小)以及一个有用的方法集合,这些方法不仅仅用于获取和设置实例变量。其次,我们的objectdraw库中的图形类为初学编程者提供了极佳的视觉反馈。在创建一个图形对象时,它会立即显示在屏幕上。当对objectdraw库中的对象进行移动或调整其大小时,屏幕上的图像会立即发生变化。因此,如果程序包含一个逻辑错误,则可以立即在屏幕上反映出来。第三,图形提供了可激发兴趣的例子。使用图形时,对于学生而言,即使非常简单的程序也会变得很有趣。此外,在介绍了动画后,在介绍数组之前很容易提供有趣的例子。最后,图形在课程中可以延续。教师可以在本书的整个课程中一直使用图形库,而不是在介绍了一些对象例子后就将它们丢弃。

我们的objectdraw库不仅提供了图形类,还提供了一个WindowController类,这个类通过在窗口中心安装一个DrawingCanvas来扩展JApplet类。DrawingCanvs是JComponent类的扩展,它可以跟踪画布(canvas)上的对象,并在必要时重绘它们。这样就使初学编程的人减少了使用图形的复杂性。

事件驱动的编程

本书的一些作者赞成在基础性课程中介绍事件驱动的编程方式,因为学生每天所操作的"现实"程序就是以一种事件驱动的方式工作的。在学生使用计算机的过程中,他们很少会看到响应逐行文本输入的程序。因此,事件驱动的编程对于学生而言更有启发性。

我们认为在基础性课程中介绍事件驱动的编程方式在教学上还有一些其他的重要好处。其中一个非常重要的好处是学生能够从一开始就获得编写方法的体验。而且,本书中介绍的方法一般都很短。

在我们的objectdraw库中提供了一个环境,在该环境中,初学者可以通过定义简单的鼠标事件处理方法来学习编程。例如,我们的onMouseDrag方法类似于标准Java的mouseDragged方法,只不过前者具有更简单的参数。由于在鼠标拖动过程中会重复调用该方法,因此在不使用循环的情况下也可以构建有趣的程序。因此使用事件驱动的编程使我们可以在讨论了类的定义之后再来介绍循环,同时仍然为学生提供了令他们感兴趣的程序。

学生通过编写具有固定名称和参数数目的方法,能够获得编写方法和使用参数的体验,这样有助于简化对这些概念的介绍。例如,本书中所有的鼠标事件处理方法都采用单一的Location参数来表示事件发生时鼠标所在的位置。因此学生习惯于在相关的方法体中使用这些形参,与此同时,学生可以在图形命令中使用实参。

学生在编写具有精心指定的名称和参数的事件驱动的方法时获得的经验以及编写代码来发送具有实参的消息到图形对象时获得的经验,可以使学生很容易地过渡到自行设计和编写自己的类的方法。虽然学生仍然需要理解参数传递过程中的"如何操作"以及"为什么要这么做"等内容,但是他们已经了解并编写了许多例子,这有助于他们编写并理解自己的类。

对象优先

图形和事件驱动编程的结合可以为本书的对象优先教学方式提供支持。学生从本书第1章便开始学习使用图形库对象的程序示例。这些示例包含创建新图形对象并发送消息给它们的代码。此外,这些程序使用的类都是WindowController类的扩展。

由于我们图形库中的WindowController类是Java的JApplet类的一个扩展,因此学生不需要从静态main方法开始,也不必了解静态方法和非静态方法之间的区别。相反,他们只需要编写对鼠标事件进行响应的实例方法。因此从本书第1章开始,便要求学生学习使用对象并编写自己的方法。

在本书第6章,学生开始学习如何编写自己的类。该章位于介绍循环的章节之前,并且位于介绍条件语句的章节之后。我们使用事件驱动编程的方式使得在本书前面就有机会构建和使用令人感兴趣的类。

尽早使用并发

我们发现,如果精心挑选所用的示例以避免争用条件,学生就能够更容易地理解并发编程的概念。毕竟,我们这个世界就是并发运转的,因此对于学生而言,使多个线程并发执行没有什么不自然的。此外,使用并发机制编写许多应用程序比把它们编写成单线程要容易一些。

在我们的图形库中提供了一个ActiveObject类来支持使用和管理线程。从学生的角度来看,我们提供的ActiveObject类和Java内置的Thread类之间的区别在于:前者提供了sleep方法的一种变体,这种sleep方法不会抛出异常。ActiveObject还在后台对线程进行管理,使得当某个程序(或者网页中的Java小程序)终止时,所有的线程将优雅地终止。

为什么引入一个库

我们选择引入一个库来支持我们的教学方法,因为这样可以在本书中及早减少句法和概念上的复杂性。尽管我们一开始就使用了这个库,但是本意并不是要讲授一种与Java所支持的编程完全不同的编程方式。我们的想法是:不仅尽可能早地提供对事件驱动编程方式的支持,同时向学生讲授Java中的"正确"编程方式。

在Java中及早使用事件驱动的编程可能存在的一个障碍是必须介绍用于处理事件的一些语言和类库特性。例如,必须介绍侦听器、接口、Java事件等。此外,如果要实现某个类(例如,MouseListener类),则它必须实现所有的鼠标侦听方法,即使在程序中只需要一个方法就足够了。

而我们引入的库减少了这种复杂性,因为来自该库的WindowController类实现了鼠标侦听器接口。它还提供了事件处理方法,这些方法接受鼠标的位置Location作为参数,而不是使用一个更一般的MouseEvent。获取一个Location(一种代表屏幕上某个位置点的库类型,但它使用的是double而不是int类型)作为参数的好处是:可以立即获得有用的信息,而不需要程序员首先得把这些信息提取出来。最后,使用我们提供的库,学生只需要编写实际用于程序中的事件处理方法即可。

第11章向学生讲授了标准的Java GUI组件。此外还讲授了标准的Java事件模型。学生将学习把侦听器与用户界面组件相关联,并编写方法来处理所生成的事件。因此在那一章他们将开始学习在不使用所提供库的情况下如何进行编程,不过那时他们已经对所需要的概念有了足够的了解。

如前所述,在不使用我们所提供库的情况下,介绍线程时将需要讨论异常,以便能够暂停某个线程,此外,一个非常糟糕的做法是:在第一个讨论异常的例子中,介绍了那些必须使用sleep方法来处理的异常,因为它并没有多少需要处理的地方。由于我们认为在后期课程中(例如,在讨论I/O时)介绍异常会有更好的启发性,同时也由于它们涉及到继承和子类型的复杂性,因此我们将库设计成可以推迟讨论异常。我们并没有把这个库用作避免讲授Java关键组成部分的借口。而是用它来提供一种从教学方法上讲更合理的方式,来展示各个要介绍的概念。

教师的补充材料

教师可以访问http://eventfuljava.cs.williams.edu来获得联机补充材料。这些材料包括objectdraw库、丰富的示例程序集合、使用这个库和本书对应内容的实验作业,以及详细的讲义。

示例程序包括本书中已经包含的程序以及大量的其他示例。补充示例丰富多样,大大充实了本书所介绍的内容。在有些情况下,这些额外的示例程序强调一定的相关性(这和我们编写本书的方式相反,我们希望尽可能地减少各章节之间的相关性)。许多额外的示例涉及ActiveObject,更确切地讲,涉及动画。它们并不总是适合于在课本中作为最佳示例,因为课本是静态的媒体,但是教师可以在课堂上或实验室中极其有效地使用它们。

教师和学生的灵活性

在本书中,我们旨在为读者提供最大程度的灵活性。我们希望读者能够阅读第1、2、3、4、6、7和9章的核心基础内容。这些章介绍了objectdraw库、条件、类、while循环以及并发。第5章和第8章则对第3章和第6章介绍的主题进行了详细说明。同时,它们还介绍字符串以及声明和作用域的主题。尽管它们很重要,但是如果有必要,这两章可以在以后再学习。

在所有章中,以星号标记的可选章节可以跳过不读。

本书剩下的内容则根据在课程中介绍它们的顺序来讨论多个主题。我们发现这个介绍顺序很不错。但是,前面提到我们的一个目标是尽可能避免各个主题之间的相关性,因此教师可以根据自己的学生和实际情况来调整这些课程。图0-1显示了第10~19章之间的依存关系。特别注意,递归(以及递归数据结构)和数组可以按照任何顺序来介绍。此外也可以在介绍递归或数组之前介绍继承性。

 

图0-1  核心基础内容之后的各章节之间的依存关系

除了图0-1所示的依存关系之外,还要注意的重要一点是后面的章节要求学生对GUI有一定的了解。特别地,这些章节中的例子使用了JTextField以及setText和getText方法。

第20章"查找和排序"是一个高级主题,并且假定学生了解数组和递归。不过,有关查找内容的章节同时给出了所介绍算法的迭代版本和递归版本。

第21章"面向对象设计简介"的后半部分假定学生熟悉数组和递归。但是该章的前半部分只要求熟悉核心章节即第1~9章的内容。如果有必要,读者可以将学习设计单元的过程分为两个阶段,在学习了核心的基础内容后学习前半部分,然后在学习了更高级的主题后再学习后半部分。

最后,要提到的重要一点是,本书并不是关于Java编程语言的参考大全。我们只是根据适合初学者的水平来介绍Java语言的成分。例如,在本书后半部分的一些章节中,虽然对一些重要的概念进行了介绍,但是并没有给出水平更高的学生可能需要了解的细节。我们的目标是为学生提供一个坚实的基础,并希望他们在获得更多的经验后,将能够对Java语句具有更深入全面的了解。

额外的实用内容

在本书的几个附录中加入了大量有用的额外内容。附录A提供了编程风格指导原则。尽管Java程序员需要遵循一些标准的约定,但是一些编程风格问题显然是比较主观化的。学生在学习时应当注意教师可能提供的自身编程心得。

附录B总结了objectdraw库中可用的类和方法。在附录C中,介绍了浏览Java API文档的过程。API(Application Programming Interface,应用程序编程接口)指定了程序员在使用某个库所提供的资源时必须了解的细节。我们介绍了objectdraw库的部分API,但是由于许多API的文档遵循一个标准格式,因此读者应当能够自行阅读其他的API文档。

从我们的objectdraw库过渡到标准Java相当直观。附录D总结了标准Java等价于objectdraw库的一些特性。

致谢

如果没有许多人的帮助和反馈,本书是不可能问世的。首先要感谢威廉斯学院的大学同事:Barbara Lerner、Jim Teresco、Steven Freund和Stacia Wyman,他们很乐意并甘愿使用我们所提供的多少有点粗略的教案以及不是特别稳定的Java图形库来进行教学。而且在过去几年中,威廉斯学院的上百名学生非常积极地接受了一个挑战,即使用我们的教材来体验一种了解计算机科学的新教学方式。我们要特别感谢本科教学助理们,他们中的许多人努力学习新的教材并使得其中的内容更容易被学生接受。此外,威廉斯学院还有许多其他的学生和我们一起开发图形库,编写实验和家庭作业问题及其解答,测试图形库并设计课程的网页。这些学生包括:Peter Applegate、Jing Cao、Brendan Dougherty、Marcus Duyzend、Cheng Hu、Jonathan Kallay、Krishna Kannan、Christine Osterman和Ashok Pillai。

在开发我们的教材时,一个很重要的部分是获得来自其他学院的教师的反馈,这些老师在他们的课程中使用了我们的教材。尽管在此由于篇幅所限,不能将他们一一列出,我们挑选出以下人员来感谢他们对我们的教材提出的极具价值的反馈:Barbara Adler、Mary Courtney、Chris Haynes、David Housman、Lonnie Fairchild、James Taylor和Douglas Troy。特别感谢Chris Nevison在他为高中预修计算机科学课程的老师们讲课时使用objectdraw库。

Prentice Hall出版社的外聘审稿人员为本书提供了非常详细的评论,尽管我们并没有一一采纳所有这些建议,但是他们的详细反馈意见使得我们能够对本书的内容进行多处改进和澄清。这些审稿人员包括:印第安那大学的Chris Haynes、Goldey-Beacom学院的Ricard Albright、罗彻斯特理工学院的Henry A. Etlinger、伦斯勒技术学院的Carlos A. Varela、卡内基梅隆大学的Ricard E. Pattis、新墨西哥州立大学的Ron Zacharski、罗彻斯特理工学院的Trudy Howles、莱恩社区大学的Mark Williams、佩斯大学的Mary Courtney、德安扎学院的Mary Ann May-Pumphrey、戈申学院的David Housman、得克萨斯州农业及工业大学的Lawrence C. Petersen、西卡罗来纳大学的Mark A. Holliday、萨斯喀彻温应用科学和技术学院的Gavin T. Osborne以及路易斯维尔大学的Adel S. Elmaghraby。

我们特别感谢Prentice Hall出版社的各位编辑:Petra Recter,是他和我们签约编写本书;Kate Hargett,在Petra换到一个新部门后是Kate接替了他的工作,她不顾刚刚生完第一个小孩后的辛劳就开始着手编辑我们发给她的这本书的原稿;还有Tracy Dunkelberger,他一直负责本书直到它付印为止。我们还要感谢我们的制作编辑Irwin Zucker。

参与本书翻译的人员有:杨战伟、陈宗斌、陈征、陈婷、陈红霞、管学岗、王新彦、金惠敏、张海峰、张瑜、许瑛琪、张靖、张景友、戴锋、张德福、张士华、张锁玲、杜明宗、高玉琢、王涛、许勇光、张新丽、乔健、徐丽萍、李杰、徐昌春、江辉、江丽华、彭青、王信花、郑来强、胡仁衡、郑来勇、薛秋丕、杨月华、丁桂英、赵琰、王晔、孙海霞和徐春艳等人。

目录

第1章  什么是编程 1

1.1  在并不了解的情况下 2

1.2  Java编程语言 5

1.3?Java初体验 6

1.3.1  简单的响应程序 7

1.3.2  "Class"和其他关键字 8

1.3.3  关于方法的介绍 9

1.4  编程工具 11

1.5  绘图原始命令 14

1.5.1  图形坐标系统 14

1.5.2  构建图形对象 16

1.6  其他事件处理方法 19

1.6.1  鼠标事件处理方法 19

1.6.2  begin方法 20

1.7  错误分析 21

1.8  小结 23

1.9  本章复习题 24

1.10  编程题 25

第2章  Java中的名称 26

2.1  命名和修改对象 26

2.1.1  修改器方法 26

2.1.2  实例变量声明 28

2.1.3  为变量名指定含义 29

2.1.4  注释 30

2.1.5  其他的修改器方法 31

2.1.6  习题 33

2.2  非图形类对象 35

2.2.1  颜色类 35

2.2.2  Location类 37

2.3  画布上的层次 40

2.4  访问鼠标的位置 41

2.5  在方法之间共享参数信息 42

2.6  小结 47

2.7  本章复习题 47

2.8  编程题 48

第3章  处理数字 50

3.1  访问器方法介绍 50

3.2  访问画布的数值属性 52

3.3  表达式和语句 53

3.4  算术表达式 55

3.5  数值实例变量 58

3.6  初始值设定项 60

3.7  命名数值变量 61

3.8  显示数值信息 63

3.8.1  将数字作为Text显示 64

3.8.2  使用System.out.println 65

3.8.3  混合文本和数字 67

3.9  随机数 69

3.10  小结 71

3.11  本章复习题 72

3.12  编程题 73

第4章  进行选择 76

4.1  一个简单的例子:使用if语句统计选票 76

4.2  if 语句 79

4.3  了解条件 81

4.4  在多个选项之间选择 84

4.5  有关Boolean表达式的更多内容 87

4.6  嵌套条件 90

4.7  小结 94

4.8  本章复习题 95

4.9  编程题 97

第5章  基本类型、运算符和字符串 99

5.1  运算符和方法调用 100

5.2  不同但相等 103

5.3  运算符和优先级规则 105

5.4  Double类型 106

5.4.1  Java需要多种数值类型 107

5.4.2  使用double和int的算术 108

5.4.3  显示double值 111

5.4.4  将有理数称为double的原因 112

5.4.5  选择某种数值类型 113

5.5  数值信息的方便来源 113

5.5.1  确定时间信息 113

5.5.2  高级数学计算 115

5.6  字符串 119

5.7  本章复习题 122

5.8  编程题 124

第6章  类 126

6.1  一个没有类的例子 126

6.2  编写FunnyFace类 129

6.2.1  实例变量 130

6.2.2  方法和参数 130

6.2.3  编写访问器方法 131

6.2.4  构造函数 132

6.2.5  组装到一起 134

6.3  加入方法到FunnyFace 136

6.3.1  加入一些类似已编写方法的方法 137

6.3.2  间接定义方法 137

6.3.3  使用this作为参数 139

6.4  另外一个例子:实现Timer类 140

6.5  局部变量 142

6.6  重载方法和构造函数 145

6.7  小结 148

6.8  本章复习题 148

6.9  编程题 149

第7章  控制结构 151

7.1  重复过程和while循环 151

7.2  使用while循环的更多例子 155

7.3  可以计数的循环 157

7.4  嵌套循环 158

7.5  控制结构风格指导意见 161

7.6  第摩根法则和复杂的boolean表达式 164

7.7  简化条件语句的语法 166

7.8  switch语句* 172

7.9  小结 174

7.10  本章复习题 174

7.11  编程题 175

第8章  声明和作用域 178

8.1  访问控制:public和private 178

8.2  使用实例变量、参数和局部变量 181

8.3  标识符的作用域 183

8.4  使用static 186

8.5  小结 187

8.6  本章复习题 187

第9章  活动对象 189

9.1  动画 189

9.2  活动对象 190

9.3  Image和VisibleImage 192

9.4  与活动对象交互 194

9.5  使活动对象影响到其他的对象 197

9.5.1  与非活动对象交互 197

9.5.2  构建其他活动对象的活动对象 198

9.6  不带循环的活动对象 201

9.7  使动画效果更平滑 202

9.8  有关计时的更多提示 203

9.9  小结 205

9.10  本章复习题 205

9.11  编程题 206

第10章  接口 207

10.1?提供灵活性的接口 207

10.1.1  第一个例子 207

10.1.2  将对象和类与接口相关 208

10.1.3  使用接口 212

10.1.4  接口的其他特性 214

10.1.5  小结 215

10.2  在objectdraw库中使用接口 215

10.3  扩展接口* 218

10.4  小结 220

10.5  本章复习题 220

10.6  编程题 221

第11章  Java中的图形用户界面 223

11.1  文本字段 223

11.1.1  加入文本字段到窗口中 225

11.1.2  从文本字段获得信息 226

11.2  Java中的按钮和事件 227

11.2.1  创建和加入按钮 228

11.2.2  处理事件 228

11.3  在程序中使用GUI组件的步骤

??? 清单 229

11.4  组合框 230

11.5  面板和布局管理器 235

11.5.1  面板 235

11.5.2  有关布局管理器的更多

????内容 238

11.6  其他GUI组件 240

11.6.1  滑块 240

11.6.2  标签 243

11.6.3  JTextField和JTextArea 244

11.7  处理击键和鼠标事件 247

11.7.1  击键事件 247

11.7.2  鼠标事件 249

11.8  小结 250

11.9  本章复习题 252

11.10  编程题 253

第12章  递归 254

12.1  递归结构 255

12.1.1  嵌套矩形 255

12.1.2  使用递归结构来创建并

????搜索数据集合 263

12.1.3  设计递归结构 266

12.1.4  为什么能够奏效 268

12.1.5  花菜图案 269

12.2  递归方法 274

12.2.1  快速求幂 275

12.2.2  汉诺塔 277

12.3  小结 280

12.4  本章复习题 280

12.5  编程题 281

第13章  Java中的一般循环 282

13.1  确定循环模式 282

13.2  计数和for循环 283

13.2.1  使用for循环的例子 284

13.2.2  for循环的其他变化形式 287

13.3  do-while循环 288

13.4  避免循环错误 289

13.4.1  循环次数相差1的错误 289

13.4.2  无限循环 290

13.4.3  在终止条件中使用double类型 291

13.5  小结 292

13.6  本章复习题 293

13.7  编程题 294

第14章  数组 295

14.1  声明数组名称 295

14.2  创建数组 296

14.3  使用数组:一个三角类 300

14.4  Java 1.5中的增强型for循环 303

14.5  收集数组信息 304

14.5.1  超速驾驶驾驶员计数 306

14.5.2  绘制直方图 307

14.6  包含变量大小的集合 311

14.6.1  并行数组和对象数组 313

14.6.2  跟踪集合的大小 314

14.6.3  加入项目到数组 315

14.6.4  显示结果 316

14.7  添加和删除数组元素 322

14.7.1  加入某个元素到一个顺序

????数组 322

14.7.2  从数组删除某个元素 328

14.8  小结 330

14.9  本章复习题 331

14.10  编程题 335

第15章  多维数组 338

15.1  一般的二维数组 338

15.1.1  声明数组的数组 339

15.1.2  创建数组的数组 339

15.1.3  对数组的数组进行索引 341

15.1.4  遍历二维数组 342

15.1.5  超越二维:扩展日历程序 344

15.2  矩阵 347

15.2.1  魔力方块 348

15.2.2  声明和构建矩阵 348

15.2.3  遍历矩阵 348

15.2.4  填充魔力方块 351

15.2.5  数字图像平滑 353

15.3  小结 357

15.4  本章复习题 357

15.5  编程题 359

第16章  字符串和字符 362

16.1  小字符串和大字符串 362

16.1.1  空白字符串 362

16.1.2  长字符串 363

16.2  有用的String方法集锦 365

16.2.1  创建一个URL字符串 365

16.2.2  使用indexOf来查找

????子字符串的位置 365

16.2.3  处理小写和大写 367

16.2.4  剪切和粘贴字符串 369

16.2.5  修整字符串 371

16.2.6  比较字符串 372

16.3  字符 374

16.3.1  字符和字符串 375

16.3.2  对字符进行操作 377

16.4  小结 379

16.5  本章复习题 381

16.6  编程题 383

第17章  继承 385

17.1  特殊化扩展 385

17.2  使用extends 386

17.3  protected和public 391

17.4  设计用于扩展 394

17.5  继承的层次结构 397

17.6  重写方法定义 401

17.6.1  object类以及equals和toString方法 403

17.6.2  使用super访问重写的方法 403

17.6.3  动态方法调用 405

17.6.4  有计划的废弃 406

17.6.5  抽象类和抽象方法 410

17.7  小结 411

17.8  本章复习题 411

17.9  编程题 417

第18章  异常 420

18.1  异常处理程序 421

18.2  异常是对象 424

18.3  异常传递 424

18.4  处理多个异常 426

18.5  异常子类 427

18.6  检查异常和未检查异常 429

18.7  抛出异常 432

18.8  小结 433

18.9  本章复习题 434

18.10  编程题 436

第19章  流 438

19.1  文本流 439

19.1.1  书签文件:一个示例 439

19.1.2  创建一个Writer 441

19.1.3  通过Writer发送数据 442

19.1.4  PrintWriter 445

19.1.5  构成Writer类 446

19.2  Reader 447

19.3  编写一个应用程序 451

19.4  处理文件系统 455

19.5  Socket和流 459

19.5.1  客户和服务器 459

19.5.2  网络协议 460

19.5.3  创建和使用Socket 461

19.5.4  从服务器接收信息 462

19.5.5  从Web页面提取信息 465

19.6  小结 468

19.7  本章复习题 469

19.8  编程题 473

第20章  查找和排序 475

20.1  查找 475

20.1.1  线性查找 476

20.1.2  数组的递归处理方式 476

20.1.3  线性查找的复杂度 478

20.1.4  二叉查找 478

20.2  使用先验条件和后验条件 482

20.3  排序 483

20.3.1  选择排序 484

20.3.2  选择排序的复杂度 487

20.3.3  插入排序 488

20.3.4  插入排序的复杂度 490

20.3.5  归并排序 491

20.3.6  归并排序的复杂度 494

20.4  查找和排序的复杂度的影响 496

20.5  小结 497

20.6  本章复习题 497

第21章  面向对象设计简介 498

21.1  什么是面向对象设计 498

21.2  属性和行为 499

21.2.1  为对象的属性建模 499

21.2.2  对行为建模 499

21.3  设计基本原理 500

21.3.1  设计步骤1:确定要建模

????的对象 500

21.3.2  设计步骤2:列出每种对象的属性和行为 500

21.3.3  设计步骤3:用实例变量对属性建模 502

21.3.4  设计步骤4:用方法对行为建模 504

21.3.5  设计:细化的过程 507

21.3.6  填充细节 507

21.3.7  设计过程总结 513

21.4  增量式测试和调试 514

21.4.1  开发和测试各个类 514

21.4.2  把各部分组装起来:测试控制器 516

21.5  不对现实世界建模的类 517

21.5.1  动画式藏豆赌博游戏 518

21.5.2  确定不代表现实世界实体的类 518

21.5.3  完成动画式藏豆赌博游戏的设计 518

21.5.4  填充动画式藏豆赌博游戏的细节 522

21.6  编写注释的指导原则 524

21.7  封装和信息隐藏 526

21.7.1  嵌套矩形:一个图形对象类 526

21.7.2  封装和抽象之间的

????重要关系 529

21.8  小结 529

21.9  本章复习题 530

21.10  编程题 530

附录A  编程风格指导原则 532

A.1  加注释 532

A.2  空白行 533

A.3  名称 533

A.4  格式 533

附录B  objectdraw API总结 534

B.1?WindowController 534

B.1.1?在Controller或WindowController

的扩展中定义的方法 534

B.1.2  在WindowController的扩展中

定义的方法 534

B.1.3  在扩展Controller或

WindowController的类中

调用的方法 534

B.2  ActiveObject 535

B.2.1  在ActiveObject的扩展中

定义的方法 535

B.2.2  在扩展ActiveObject的类中

调用的方法 535

B.3  Drawable对象 535

B.3.1  Drawable对象的构造函数 535

B.3.2  用于所有Drawable对象

的方法 537

B.3.3  仅用于Line的方法 537

B.3.4  用于矩形、椭圆形、VisibleImage

和Text对象的方法 538

B.3.5  仅用于矩形、椭圆形和

VisibleImage的方法 538

B.3.6  仅用于Text对象的方法 538

B.4  辅助类 538

B.4.1  辅助对象的构造函数 538

B.4.2  用于Location对象的方法 538

B.4.3  用于RandomIntGenerator

对象的方法 539

 

B.4.4  用于RandomDoubleGenerator

对象的方法 539

B.5  类型和接口层次结构 539

B.5.1  几何对象的子类层次结构 539

B.5.2  几何对象的子接口层次结构 539

B.5.3  控制器的子类层次结构 540

附录C  浏览Java API 541

C.1  objectdraw文档简介 541

C.2?获取关于某个类的信息 542

C.2.1  关于构造函数和方法的汇总

信息 542

C.2.2  关于构造函数和方法的详细

信息 544

C.3  何时应该查阅API 545

C.4  其他Java API 546

附录D  不使用objectdraw编程 547

D.1  扩展JApplet而不是Controller 547

D.2  扩展JApplet而不是

???WindowController 548

D.3  Java线程可以代替ActiveObject 549

D.4  Java图形 550

D.5  随机数生成器 553

D.6  应用程序与Java小程序 553

D.6.1  将Java小程序修改成应用

程序 554

D.6.2  从JFrame中运行Java

小程序 555

作者简介

编辑推荐

作者寄语

电子资料

www.luweidong.cn

下一个