前言如今,Java非常适合选择作为介绍性编程的课程。其理由很多:互联网的使用持续爆炸性地增长;面向Web应用的程序已成为软件的主流,而Java正是为互联网编程的语言;Java还提供了成熟的软件开发工具、以及大量包括多线程和高级图形用户界面在内的各种应用程序的开发包;而体系结构中立的设计使Java具有很好的可移植性。近年来,安全与可靠的重要性有了新的意义,Java对安全与可靠的支持与其自身的设计融为一体。面向对象使Java成为现代软件工程和编程概念的良好教学载体。背景从20世纪90年代早期以来,在国家科学基金会(NationalScienceFoundation)的大力支持下,本系(弗吉尼亚大学计算机科学系——译者注)发展、提炼并扩展了新的计算机科学的课程。在考察本课程与同类学校的课程的过程中,经常使用的一些重要原则是:*使用一种课堂以外被广泛接受的编程语言。*使用现代软件开发工具。*鼓励团队合作。*按照软件工程原则开发系统。*鼓励重用现有的库和工具。*用图形用户界面实现软件的输入、输出。*选用适合各种听众的教学法和例子。本书的内容及其补充材料都用来支持这些原则的发展。计算机科学中的许多重要概念和问题,在很好地理解什么是程序以及如何写程序之前,不会被赏识。遗憾的是,学会编程很困难。如同要写好文章一样,好的编程需要多年的实践。教授编程在很多方面与教授写作相似。在学习写作的过程中,学生通过阅读好散文的范例,反复地练习写作,学习怎样组织构思,以实现最有效的表达。学生从写作、编辑一两个段落开始,直到能写出很长的文章,如散文、短故事和报告。学生们的写作技能也随着不断地增长。教授程序设计的方法与教授写作类似。贯穿本书,介绍并讨论了很多好的和不好的例子,自我检测和程序练习,给学生提供了设计、组织和编写代码的练习机会。另外,还提供了帮助学习修改代码这个实用技能的例子,这部分通过专供学生修改的代码来实现。这种方法很有效,因为,这样能迫使学生成为积极的参与者,即学生一定要去阅读并理解所提供的代码。为支持这一努力,本书所使用代码的电子版在本书的网站上可以找到。本书的目的本书的目标是成为学生的第一门编程课程,而且适合于各种不同学科的人。本书假定读者以前没有编程技能,要求的数学和科学知识,相当于大学一年级学生的水平。本书的主要目的是:*向学生介绍Java编程语言;*展示和鼓励使用面向对象范例;*有效地解决问题的技术示范;*使学生从事现实世界中的例子;*教给学生软件工程设计的概念;*向学生介绍Java的核心类库和图形库;*给学生组织和编写代码的实践;*传授学生修改现有代码的实际技能;*给出好的,以及不好的编程指导性例子;*提供测试和调试的有效内容。本书的特点及其原因本书深入覆盖了介绍性课程应有的全部资料,还介绍了许多通常包含在后续课程中的资料,并对余下的问题指出要点。章节的篇幅和安排提供了教师讲解内容和时间安排上的灵活性。章节的内容和扩展的附录使有能力的读者可以更上一层楼,并把本书当作一个有价值的参考资源。本书的一些特点如下所述。*详细介绍面向对象的概念:本书实施了“适时对象”方法。在过去的十多年里,作者把面向对象的范例用于介绍性的课程,已经证明Java可以成功地介绍给初学编程的人。并了解到,将自定义的类推迟到课程末尾,会限制学生掌握面向对象的编程范例的核心知识,会对面向对象编程的其他重要原则形成肤浅的认识。因此,本书很早就介绍了对象表示方法。使学生们从一开始就可使用标准包中的对象,很快对一些有兴趣的问题开发出有意义的程序。在坚固基础的介绍后,提出了基本类和面向对象设计。在探索控制结构之后,对方法、类和面向对象设计进行了更深一步的介绍。*注重解决问题能力:许多初学者面临的最大障碍,是不知道解决问题的基本方法。对于这个问题,本书在第1章介绍了解决问题的基本技能,在以后的每一章里,把一些新概念用于满足不同读者要求而选择的问题中。学生们先学习这些有效解决问题的例子,然后再提供给他们独自解决类似问题的机会。*介绍软件工程设计的概念:本书通过对问题的研究和软件项目来介绍软件工程设计的概念。除了大量的小例子外,每一章都对一个或多个问题的细节进行考虑。在某种程度上,都有面向对象的分析和设计,以及实现设计算法的开发。*测试和调试的内容:程序员的一项重要技能,是对自己设计和实现的程序如何进行测试和调试。第13章介绍了测试和调试方面重要的软件工程概念和实践。这一章讨论的测试技术,如单元测试、整体测试和代码检查。调试的一节,注重教会学生怎样用科学方法去找出错误。该章还讨论了初学者常犯的错误和怎样识别它们。在介绍了控制结构之后,此章的内容可以在授课教师认为合适的时候讲解。*生动的实例:学生们喜欢从真实生活中遇到的有趣情况来学习,多元化的研究和编程方案来源于不同的主题,包括:身体锻炼、兜售信息、医疗诊断、统计分析、性格类型分析、数据可视化、图形、娱乐和动画。通过这些不同的例子,本书展示了程序员可以怎样参与日常生活并为之做出贡献。*只用标准Java类:本书在介绍Java编程概念时,只使用标准的Java类。特别没有用外界购入或由作者自己写的类。选用标准的类和技术,这样做,使初学者容易理解。*实验室手册:在介绍性课程中,对采用实验室教学的学校,本书配有打印好的实验室手册。实验室资料提供了动手的经验,以强化Java编程的概念和技能。需要实验手册的读者请与McGraw-Hill出版社的当地代表处联系。*编程和风格的技巧:除了解释Java和面向对象编程,本书还对怎样成为一个更好、更有见地的程序员和设计者提出了忠告。在诸如避免常见的编程错误、写可读性好的代码以及遵循软件工程原则等方面,有一些很重要的技巧。*自测题、练习题和软件方案:每章都提供带有答案的自测题,以便学生能评价自己对重要概念的技能掌握。本书还提供了数百道练习题,授课教师可以通过出版社得到项目。在第1章Java的基本概念介绍之后,第2章和后续的每章都提供了编程方案,来练习本章的概念。*参考附录:附录C、D和E提供近两百页对标准JavaAPI的描述,这使得本书在课程结束后,可以成为一个手头的参考手册。章节概述和特点引言每章的开始都有一个简短介绍,以引起学生的注意,并为本章的内容做好准备。既强调主题的现时重要性,也强调每章主题在更广泛的编程上下文中的地位。目标介绍之后,有一个本章目标的列表,给学生提供了一套明确的学习目标。这一列表,使学生在学习本章内容时,可用来衡量自己的进展,也可在学习章节结束时,用来评价自己理解的程度。还可作为授课教师准备考试和小测验的指导。图标和信息栏图标和带阴影的信息栏显示了警告、风格技巧、推荐阅读材料和属于Java语言本身的信息。表明关于编程的警告,通常是怎样避免常见编程错误的窍门。表明与编程风格有关的资料。表明与Java程序语言有关的资料。表明编程窍门,或更具体的讨论资料,或现有论题的补充。代码格式化特殊格式的代码清单,使代码部分易于查找和参考。每一个完整的清单是按照所在章节中的位置编序。代码段与周围的文字清晰地分开,而且有很容易识别的作者注释。UML图用UML图帮助阐明类之间的关系,同时,也使学生熟悉这个广泛应用的符号系统。案例学习每章都有多个案例学习,用来讲解有效解决问题的技能,强化面向对象编程和软件工程设计概念。每个案例学习的开始,都突出明确的学习目标,并用特殊的图标强调解决问题的步骤。案例学习的讲解可以选择,只应用本章的概念,而不介绍新概念。章节评论每章结尾,都对本章的要点做了全面的、逐点的总结。自测题每章结尾,都有带答案的自测题。自测部分的目的是帮助学生衡量自己是否掌握了本章的目标,并强化本章的关键概念。编程项目除了第1章介绍背景知识外,以后每章都至少有一个有趣的编程项目学习,作为一类作业的方式给出。编程项目学习包括确定训练范围;收集电子邮件的地址;医疗诊断;汽车贷款计算器;模拟鱼缸等。练习每章结尾的练习部分提供需要努力解决的各种问题。章节概要*第1章:背景知识。包括计算机结构、软件、软件工程原则、面向对象软件的开发、问题求解。*第2章:Java基本概念。包括程序组织、main()方法、注释和空格、类、关键词、标识符和命名习惯、方法、程序执行、SDK、常量、变量、操作、简单类型、操作符、优先级、交互式程序、简单变量赋值。*第3章:使用对象。包括String(字符串)、引用变量、null、插入、截取和连接字符串、引用赋值、String方法。*第4章:类。介绍用户定义的类、实例变量、构造方法、实例方法、检查员(inspect-tors)、变异器(mutators)、简易器(facilitators)、简单图形。*第5章:分支语句。包括布尔代数和真值表、逻辑表达式、布尔类型、布尔值相等和操作符顺序、检测浮点数相等、操作符优先级、短路评估、if语句、if-else语句、字符串和字符的测试、排序、switch语句。*第6章:循环。包括while语句、简单的字符串和字符处理、for语句、索引变量范围、do-while语句。*界面图形:基于GUI的编程。包括图形用户界面、swing、awt、基于事件的编程。*第7章:用方法和类编程。包括参数传递、控制的调用和流程、类变量、范围、局部范围、名字重用、方法重载、方法重写、equals()、toString()、clone()。*第8章:数组和集合。包括一维数组、定义、元素的访问和操纵、显性初始化、常量数组、成员、数组处理、方法、程序参数、排序、搜索、多维数组、矩阵、集合框架、ArrayList、集合算法。*第9章:继承和多态。包括面向对象设计、重用、父类、子类、单一继承、super、is-a(是一个)、has-a(有一个)和uses-a(用一个)的关系、控制继承、默认、protected和private成员、多态、抽象的父类、接口的层次。*界面图形:基于GUI的编程。在个人性格识别和微笑竞猜游戏的案例中,学习图形用户界面的设计和实施。*第10章:异常,即反常事件。包括异常、抛出(throwing)、尝试(trying)、捕获(catching)、异常处理器、finally、流的规范。*第11章:递归问题的求解。包括递归方法、排序、搜索、可视化。*第12章:线程,即多个独立的控制流程。包括进程、线程、调度和重复线程、Timer、TimerTask、Thread、Date、Calendar、JOptionPane、休眠、激活、系统软件。*第13章:测试和调试。包括软件开发中的代码评估、黑箱与白箱测试、检查、测试工具、说明覆盖、单元、整体和系统测试、回归测试、边界条件、路径覆盖、调试。*附录A:表和操作符。包括Unicode字符集、保留字、操作符和优先级。*附录B:数字表示方法。包括二进制数字、十进制数字、2的补码、转换。*附录C:Applets。即Applet编程。*附录D:标准Java包。包括java.io、java.lang、java.math、java.net、java.text、java.util。*附录E:标准Java图形包。包括java.applet、java.awt和javax.swing。界面图形通过个人观察和与同事们交流,发现不是所有的介绍性编程课程都介绍图形用户界面(GUIs),也许时间不允许介绍swingAPI和事件引发程序,因此,分成两个阶段来介绍图形编程,作为选讲内容。然而,如授课教师想强调这部分,在第4章介绍了类之后,就可以讲解GUI。应区分图形用户界面和图形图像的生成。Java标准APIs可以很容易地显示矩形、直线、圆、椭圆、三角形和多边形。它们的显示几乎与控制窗口显示文字一样容易。在其他章节的例子中,都独立地用到了这些Java特性,这些例子大部分也是可选讲的。然而,经验证明,学生们都喜欢生成图像,而且,当例子有可视化属性时,面向对象编程的概念会易于理解。用好本书本书所涵盖的内容比较多,可能一门课程讲授不完。附加的内容是有准备的,即可让授课教师在编程和软件开发方面选择主题。这本书是为灵活教学而设计的。例如,如果授课教师想推迟对类的介绍,可以先讲解控制结构的大部分内容(5.1~5.9小节和6.1~6.5小节);类似地,如果授课教师想在类之前介绍数组,数组的基本内容(8.1~8.3小节和8.7小节),可以在讨论类之前进行。除了9.2小节中的例子,对继承的讨论可以放在数组之前。在介绍了类与数组之后,可以随时开始第13章测试和调试的内容。下面是课程的布局。每周主题阅读1计算和面向对象设计第1章2编程基础第2章3对象的操纵第3章(3.1~3.5小节)4类的基本概念第4章4~5条件语句第5章(5.1~5.7、5.10小节)5~6循环语句第6章(6.1~6.5小节)7图形用户界面界面图形:I8~9类第7章10~11数组和列表第8章12~13继承和多态第9章13异常第10章(10.1小节)14测试和调试第13章(13.1~13.2小节)补充资料出版商的网站www.javaprogramprogramdesign.com提供了书中所有例子的源代码和数据文件,还有一整套PowerPoint和PDF格式的幻灯片,以及对不同Java编程IDEs的介绍。其他教学辅助材料可以在网站http://www.cs.virginia.edu/javaprogramdesign上找到。关于作者JamesCohoon是弗吉尼亚大学计算机科学系的教授,并曾经是AT&T贝尔实验室的技术人员,他从明尼苏达大学取得博士学位后就加入了这里。他两次被系里提名为大学最佳教师奖的得主。1994年,Cohoon教授获得Fulbright奖,去德国讲授面向对象编程和软件工程。Cohoon教授的研究兴趣包括算法、电子系统的计算机辅助设计、优化策略和计算机科学教育。他在这些领域发表了70多篇文章。他是美国计算机学会(ACM)、ACM设计自动化专业组(SIGDA)、ACM计算科学教育专业组(SIGCSE)、电气和电子工程师协会(IEEE)和IEEE电路与系统协会等组织的成员。他同时担任ACM委员会、SIG管理执行委员会的委员,并曾担任过ACM出版社董事和SIGDA的主席。他的联系地址:cohoon@virginia.edu,个人主页:http://www.cs.virginia.edu/cohoon。JackDavidson也是弗吉尼亚大学计算机科学系的教授,他从亚利桑那大学获取博士学位后就来到这里工作。Davidson教授因在教学中的创新而获得了NCR教员创新奖。Davidson教授的研究兴趣包括编译器、计算机结构、系统软件和计算机科学教育。他在这些领域发表了80多篇文章。他是美国计算机学会(ACM)、ACM编程语言专业组(SIGPL-AN)、ACM计算机结构专业组(SIGARCH)、ACM计算科学教育专业组(SIGCSE)、电气和电子工程师协会(IEEE)和IEEE计算机学会等组织的成员。从1994年到2000年,他是ACM在编程语言和系统方面的王牌杂志:TransactionsonProgrammingLanguagesandSystems的副主编。他是1998年程序语言设计和实现大会(PLDI'98)的主席,2000年SIGPLAN语言、编译器和嵌入系统工具工作会议(LCTES2000)的联合执行主席。他的联系地址:jwd@virginia.edu,个人主页:http://www.cs.virginai.edu/~jwd。进一步阅读下列是Java语言的主要参考书:*KenArnold,JamesGosling,andDavidHolmes,TheJavaProgrammingLanguage,ThirdEdition,Addison-WesleyPubCo;ISBN:0201704331,June2000.*BillJoy(Editor),GuySteele,JamesGosling,andGiladBracha,TheJavaLanguageSpecification,SecondEdition,Addison-Wesley,ISBN:0201310082,June2000.下面是关于标准库和更进一步的面向对象设计及程序开发的资源*DavidM.Geary,GraphicJava1.2,MasteringtheJFC:AWT,Volume1,PrenticeHall,ISBN:0130796662;September1998.*DavidM.Geary,GraphicJava2,Volume2,Swing,PrenticeHall,ISBN:0130796670,March1999.*JoshuaEngel,ProgrammingfortheJavaVirtualMachine,Addison-Wesley,ISBN:0201309726,June1999.*CayS.HorstmannandGaryCornell,CoreJava2,VolumeI,Fundamentals,PrenticeHallPTR,ISBN:0130894680,December2000.*CayS.HorstmannandGaryCornell,CoreJava2:VolumeII,AdvancedFeatures,PrenticeHall,ISBN:0130927384,December2001.*MatthewRobinsonandPavelA.Vorobiev,Swing,ManningPublicationsCompany;ISBN:1884777848,December1999.*StephenA.SteltingandOlavMaassen,AppliedJavaPatterns,PrenticeHall;ISBN:0130935387,December2001.*SunMicrosystems,JavaLookandFeelDesignGuidelines:AdvancedTopics,AddisonWesleyProfessional;ISBN:0201775824,December2001.*AlVermeulen(Editor),ScottW.Ambler,GregBumgardner,EldonMetz,AlanVermeulen,TrevorMisfeldt,JimShur,andPatrickThompson,TheElementsofJavaStyle,CambridgeUniversityPress;ISBN:0521777682,January2000.*JohnZukowski,JavaCollections,APress;ISBN:1893115925,April2001.感谢我们感谢弗吉尼亚大学为本书的完成提供了环境。我们要特别感谢JackStankovic,他的不懈地努力使得计算机科学系处于国内领先的地位。我们感谢JennaCohoon、JoanneCohoon和TomHorton的评论,我们还要感谢HannahCohoon对鱼的艺术设计和JJCohoon对图标的艺术设计。我们感谢为本书的出版做出贡献的McGraw-Hill的全体员工。特别地,我们感谢BetsyJones的支持与鼓励;TomCason的明智建议;KayBrimeyer的幕后产品管理技能;DavidHash对艺术和封面设计队伍的领导;PatSteele的编辑和DawnBercier的市场创意。我们向下列人员提出特别感谢:我们的编辑KellyLowery,她支持、指导并关注了这一项目的全过程;我们的开发编辑MelindaDougharty,她管理并汇总了审阅过程;还有MaryCahall和她的组织能力。