Java面向事件编程_Java面向事件编程

基于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。

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值