图书前言

第3版前言

(一)

程序设计是一个很古老的概念,它从算筹和算盘开始就存在了。程序设计也是一个不断更新的概念,它随着计算工具、程序设计语言、程序设计方法的不断创新而不断更新。并且随着现代科学技术的进步,其基础性、重要性日益彰显。在各级各类学校中,关于如何教好程序设计课程的问题,也越来越受到广泛的关注。

但是,从各个方面得到的信息说明,大家对于程序设计的教学效果还是没有肯定。

我应邀到过许多学校进行交流,那里的院长、系主任们抱怨最多的是,学生学了好几门程序设计语言课,但还是遇到编程就头疼。

2004年12月,在苏州大学举办的全国计算机教学研讨会上,我根据在许多学校调研的情况,提出了计算机专业的课程中学得最不好的课程就是程序设计,真正的过关率也就30%。2008年,在北京举办的一次院长、系主任论坛上,时任教育部高教司司长的张尧学院士提出,计算机专业中,80%左右的学生程序设计没有过关。这足以说明问题的严重性。

这一局面正是我不断进行程序设计教材探索的动力。

(二)

本书是《新概念Java程序设计大学教程》的第3版。它是我在教学和交流中不断探索的一个新的成果。在写作中,我注意解决了如下几个问题。

1. 先入为主地让学生一开始就进入面向对象的世界

人人都说,由于对象反映的是真实世界的对象,面向对象程序设计比较直接,容易理解。但是,实际情况是,学生学习了面向对象程序设计后,写出来的程序却是面向过程的。原因就在于我们许多教材是从面向过程开始介绍面向对象的。这种先入为主的面向过程,是不能很好地培养面向对象的思维和方法的。只有先入为主地从面向对象开始,才能让学习者根深蒂固地掌握面向对象的思维和方法。

2. 把程序测试的基本方法融入程序设计

在计算机专业的教学中,程序测试是软件工程中的内容。而在此之前就开设了程序设计课程。这样,就把程序设计与程序测试割裂开来。在学习程序设计时,一般都是以“试通”方式进行。这种“劣习”到了学习软件工程时,已经积重难返。而且,在软件工程学习时,也没有更多时间和机会进行程序测试训练了。因此,在学习程序设计的同时,让学生掌握一些基本的程序测试方法非常重要。

3. 设计模式与面向对象程序设计准则

在面向对象程序设计的实践中,人们发掘出了一些模式。这些模式对于设计者具有标杆性的启示作用。但是,就23种模式来说,也不是一门程序设计课程所能容纳的。所幸,人们又从这些模式中总结出了开闭原则、面向抽象、接口分离、单一职责、迪米特等法则。这些法则精炼,指导意义更大。但是,它们又非常抽象。经过反复琢磨,本书采取了故事引导的方法来介绍这些原则,而把几个常用的典型模式作为实例的方法。

4. 程序文档化

本书还注意了程序文档化的训练,介绍了标注(annotation)和Javadoc等。

(三)

本书没有沿袭Java教材从数据类型到控制结构的思路,而是在第1篇直接用6个实例按照“定义类—定义引用—创建对象—操作对象”的过程进行面向对象思维的训练,形成面向对象的思维主线,把数据类型、控制结构等语法嵌于其中。同时介绍基于组件的测试方法。

不了解设计模式,就没有掌握面向对象的真谛。本书第2篇以面向抽象为题,首先介绍抽象类和接口,然后引出面向对象的几个基本原则,接着通过3个例子引出GoF设计模式,最后介绍反射、配置文件和程序打包发布。这一篇不仅让学生了解了面向对象的真正意义,也更贴近了应用实际。

第3篇通过多线程、图形用户界面、网络编程、JavaBean和持久化,加深对于API意义和应用的理解,为开发应用程序奠定基础。

第4篇介绍Java Web开发和软件架构。

这4篇有详有略。详者为夯实Java开发的坚实基础,并学到实用的本领;略者为读者了解Java技术的全貌,以便将来确定在何处突破。这4篇也形成了4个学习层次,便于相关教学单位根据教学对象和目的进行取舍。

(四)

我国著名教育家陶行知说道:“行动是老子,知识是儿子,创造是孙子”,并倡导“知行合一”。世界上第一所完全为发展现代设计教育而建立的学院的创始人——包豪斯(Bauhaus)的名言“干中学(learning from doing)”已经成为现代教育的重要思想。所有这些都表明了实践在学习中的重要性。程序设计更是这样,仅仅学习了一些程序设计语言的语法,仅仅了解了一些程序设计的方法,仅仅有了“知”,而不一定“会”。要想会,就要实践。

由J.Piaget、O.Kernberg、R.J.Sternberg、D.Katz、Vogotsgy等人创建的建构主义(constructivism)学习理论认为,知识不是通过教师传授得到,而是学习者在一定的情境即社会文化背景下借助其他人(包括教师和学习伙伴)的帮助,利用必要的学习资料,通过意义建构的方式而获得的。在信息时代,人们获得知识的途径发生了根本性的变化,教师不再是单一的“传道、授业、解惑”者,帮助学习者构建一个良好的学习环境也成为其一项重要职责。当然,这也是现代教材的责任。本书充分考虑了这些问题。

在这本书中,在每章后面都安排了概念辨析、代码分析、开发实践和探索深究4种自测和训练实践环节,为学习者搭建起一个立体化的实践环境。

1. 概念辨析

概念辨析主要提供选择和判断两类自测题目,帮助学习者理解本章中学习过的有关概念,把当前学习内容所反映的事物尽量和自己已经知道的事物相联系,并认真思考这种联系,通过“自我协商”与“相互协商”,形成新知识的同化与顺应。对于这种类型的习题,读者应当按照如下顺序完成:

(1) 先给出自己的判断。

(2) 设计一个小的程序,验证自己的判断。

(3) 结合自己的判断对验证结果进行分析,说明原因。

2. 代码分析

代码阅读是程序设计者的基本能力之一。代码分析部分的主要题型有4种:

(1) 要求给出执行结果。

(2) 要求找出错误。

(3) 选择一个答案。

(4) 填写一个空白。

3. 开发实践

提高程序开发能力是本书的主要目标。本书在每章后面都给出了相应的作业题目。但是,完成这些题目并非就是简单地写出代码,而且要将它看作是一个思维+语法+方法的工程训练。因此,要求在上机之前先写出准备文档。准备文档包括以下内容:

(1) 问题分析与建模。

(2) 源代码设计。

(3) 测试用例设计。

这些文档内容的准备应当作为是否可以上机作业的条件。没有做这些准备的学生,上机就是盲目行为,收获不会太大。在学校中,学生进入机房之前,教师应当先检查学生是否已经准备了这些内容,并将准备情况作为该次上机作业成绩的一部分或不允许上机。

经过上机作业,学生还应当提交作业报告。作业报告包括如下内容:

(1) 上机作业时发现的问题。

(2) 对于发现的问题采取的调试方法。

(3) 对自己准备文档中给出的测试用例的评价。

(4) 程序运行结果分析。

(5) 编程心得。

4. 探索思考

建构主义提倡,学习者要用探索法和发现法去建构知识的意义,学习者要在意义建构的过程中主动地搜集和分析有关的信息资料,对碰到的问题提出各种假设并努力加以验证。按照这一理论,本书还提供了一个探索思考栏目,以培养学习者获取知识的能力和不断探索的兴趣,同时可以从更深层次上探究Java语法。

(五)

写书难,写教材更难。一本专著,仅用于表达自己的见地;而一本好的教材,不仅是科学技术知识和方法的精华,还应当是先进教育理念的结晶。离这些,我还差得很远。好在有20余年教学的经历和不断进行教学改革探索的积累,以及许多热心者的支持和帮助。

这一版终于要问世了。在此,我要衷心感谢在这本书的出版过程中付出了劳动的下列人员:姚威、古辉、陶利民、赵忠孝、张展为、张秋菊、史林娟、张友明、李磊、张展赫、戴璐、文明瑶、陈觉、吴灼伟(插图)。

本书的出版仅仅是我程序设计教学改革中的一个新台阶,前面的路还要继续走下去。为此,衷心希望能得到有关专家和读者的批评和建议,也希望结交一些志同道合者,把这项改革推向更新的境界。

张基温2018年1月                        第2版前言

本书是《新概念Java程序设计大学教程》的第2版。这一版修订有如下考虑: 

(1) 第1版把JSP作为Java技术的一部分介绍,这样可以形成一个完整的Java技术体系,在教学中一气呵成,可以提高教学效率。但是目前多数学校将Java基础与Java Web分开,作为两门课程进行讲授。第2版就是为了满足这种需求而进行的修订——将Java Web程序开发有关的部分删除,另行成册。

现在,Java有两个应用方面: 桌面系统应用和Web系统应用。做这两个题目时,把GUI加进来,就是一个完整的桌面系统开发实践。再加上Servlet和JSP的学习,完成一个Web系统的开发,就可以全面领略Java技术了。

(2) 在开发实践和教学中,越来越体会到设计模式的重要性。但其内容相当抽象,并且设计模式也不仅仅限于GoF的23种模式,它是一个宽泛又不断发展的概念。为此,在这次修订中,除了继续按照第1版的方法,用一个故事趣味性地引出面向对象程序设计原则、列举了几种设计模式,并介绍了JavaBean之外,还在JDBC最后引出了DAO模式,并根据DAO模式的需要对前面的设计模式举例进行了改写,形成一个贯穿全书的设计模式思想。

(3) 现代程序设计强调代码的可读性和安全性,因此,第2版增加了关于Annotation和Javadoc的介绍。

(4) 程序设计语言在不断发展,在教学中还应当适时介绍一些在基本内容上扩展的Java机制,如: 

 正则表达式。

 JVM运行时数据区。

 泛型编程、Java数据接口,将它们与多线程一起作为Java高级技术介绍。

这样,就形成了第2版的4篇内容: 

第1篇为面向对象启步,用5个例子引导读者逐步建立面向对象的思维方式和培养基本的设计能力,将Java基本语法贯穿其中;第2篇为面向抽象的编程,主要介绍抽象类、接口、面向对象程序设计原则、设计模式举例和反射技术;第3篇为基于API的开发,包括图形用户界面、网络编程、JDBC、JavaBean、程序文档化、程序配置和打包与发布;第4篇为Java高级技术,包括泛型编程、多线程技术、数据结构和接口。

在本书的前面一些单元中,除了基本内容外,还开辟了“知识链接”栏目,作为基本内容的扩展和延伸。这些内容可以作为选学或自学内容。

程序设计是一门实践性极强的课程。其实践包含两个方面的训练: 思维能力训练和语言运用能力训练。本书为此提供了丰富的习题。此外,在学时安排上还建议增加相应课程设计。经过多年的教学实践,本人推荐3种课程设计题目: 

 多人聊天。

 一个信息系统的DAO。

 关于数据结构的应用。

在做这些题目时可以分别提出如下要求: 

 使用图形用户界面。

 使用JavaBean。

 使用反射。

 使用有关模式以及MVC。

 使用多线程。

 使用Javadoc和Annotation。

 ……

在第2版即将出版之际,要特别感谢传智播客的高美云先生仔细审读了本书的有关章节,提出了非常中肯的修改意见;也要感谢参加过一些编写和校阅工作的赵忠孝、陶利民、姚威、古辉、张展为、李磊、董兆军、张秋菊、史林娟、张友明、张展赫、陈觉、吴灼伟(插图)等人。

本书没有采用传统的语法体系,而是采用了自己倡导的“问题 + 计算思维”体系编写。这个体系已经经过了十几年的摸索,在新一版即将面世之际,衷心地希望读过、用过本书的有关专家和学习者能不吝批评指正,提出宝贵意见,把程序设计教学改革向前再推进一步。

张基温2016年6月第1版前言

这是我第3次写Java教材了。第1次是2001年,应清华大学出版社之约,写了《Java程序开发教程》,并配有一本习题解答。第2次是2010年,应中国电力出版社之约,写了《新概念Java教程》。这一次又应清华大学出版社之约,写了《新概念Java程序开发大学教程》。

近几年,我所写的程序设计教材都冠以“新概念”。所谓“新概念”,并非我能在一种程序设计语言中添加什么概念,而是企图建立一种新的程序设计教学的模式来改变程序设计课程教学效率不高,甚至不成功的现状。

(一)

在多年的程序设计课程教学实践以及广泛地与国内同行的交流中,自己感到或听到的,都是认为程序设计课程不太成功的说法。

有的学校的系主任(院长)抱怨,学生学习了几门程序设计课程,可是到了课程设计、毕业设计,遇到问题还是下不了手。

多数程序设计课程老师都认为,教了C++、Java,可是学生遇到的问题,写出来的代码还是面向过程的。

许多学生告诉我,不知道如何测试程序,甚至学习了软件工程以后,设计了程序也还是简单地试通一下,根本没有规范化测试的习惯。

企业界的朋友告诉我,企业界已经在关注设计模式和软件架构,而新入职的软件专业的大学生对此还完全没有概念……

所有这些问题都落实到一点上: 程序设计课程应当教什么?应当如何教?

(二)

教材是教学的剧本。程序设计课程的改革首先应当从教材改革开始。创新是发展的动力,教材的改革要求教材有所创新。

计算机程序设计教材的创新,首先要改变程序设计教材基于语法体系的结构。说到底,语法体系的程序设计教材都是程序设计语言手册的翻版。这种语法体系造就了重语法教学、轻思维训练的教学模式,是学习了程序设计课程却不会编写程序的祸根。

新概念系列力图在这个方面创出一条新路。本书没有沿袭Java教材从数据类型、控制结构开始的思路,而是在第1篇直接用6个实例按照“定义类—定义引用—创建对象—操作对象”的过程进行面向对象思维的训练,形成面向对象的思维主线,把数据类型、控制结构等语法嵌于其中。同时介绍基于组件的测试方法。

不了解设计模式,就没有掌握面向对象的真谛。本书第2篇以面向抽象为题,首先介绍抽象类和接口,然后引出面向对象的几个基本原则,接着通过3个例子引出GoF设计模式,最后介绍反射、配置文件和程序的打包与发布。这一篇不仅让学生了解了面向对象的真正意义,也更贴近了应用实际。

第3篇通过多线程、图形用户界面、网络编程、JavaBean和持久化加深对于API意义和应用的理解,为开发应用程序奠定基础。

第4篇介绍Java Web开发和软件架构。

这4篇有详有略。详者为夯实Java开发的坚实基础,并学到实用的本领;略者为读者了解Java技术的全貌,以便将来确定在何处突破。这4篇也形成4个学习层次,便于有关教学单位根据教学对象和目的进行取舍。

(三)

我国著名教育家陶行知说过,“行动是老子,知识是儿子,创造是孙子”,并倡导“知行合一”。世界上第一所完全为发展现代设计教育而建立的学院——包豪斯(Bauhaus)的名言“干中学(learning from doing)”已经成为现代教育的重要思想。所有这些都表明了实践在学习中的重要性。程序设计更是这样,仅仅学习了一些程序设计语言的语法,仅仅了解了一些程序设计的方法,仅仅有了“知”,而不一定“会”。要想会,就要实践。

由J.Piaget、O.Kernberg、R.J.Sternberg、D.Katz、Vogotsgy等创建的建构主义(constructivism)学习理论认为,知识不是通过教师传授得到的,而是学习者在一定的情境(即社会文化背景)下借助其他人(包括教师和学习伙伴)的帮助,利用必要的学习资料,通过意义建构的方式而获得的。在信息时代,人们获得知识的途径发生了根本性的变化,教师不再是单一的“传道、授业、解惑”者,帮助学习者构建一个良好的学习环境也成为其一项重要职责。当然,这也是现代教材的责任。本书充分考虑了这些问题。

本书的每一单元后面都安排了概念辨析、代码分析、开发实践和思考探索4种自测和训练实践环节,为学习者搭建起一个立体化的实践环境。

1. 概念辨析

概念辨析主要提供选择和判断两类自测题目,帮助学习者理解本节学习过的有关概念,把当前学习内容所反映的事物尽量和自己已经知道的事物相联系,并认真思考这种联系,通过“自我协商”与“相互协商”形成新知识的同化与顺应。对于这种类型的习题,读者应当按照如下顺序完成:

(1) 先给出自己的判断。

(2) 设计一个小的程序,验证自己的判断。

(3) 结合自己的判断对验证结果进行分析,说明原因。

2. 代码分析

代码阅读是程序设计者的基本能力之一。代码分析部分的主要题型有4种:

(1) 要求给出执行结果。

(2) 要求找出错误。

(3) 选择一个答案。

(4) 填写一个空白。

3. 开发实践

提高程序开发能力是本书的主要目标。本书在绝大多数单元后面都给出了相应的作业题目。但是,完成这些题目并非就是简单地写出其代码,而要将它看作是一个思维+语法+方法的工程训练。因此,要求在上机之前先写出准备文档。准备文档的内容包括: 

(1) 问题分析与建模。

(2) 源代码设计。

(3) 测试用例设计。

这些文档内容的准备应当作为是否可以上机作业的条件。没有这些准备,上机就比较盲目,收获不会太大。在学校中,学生进入机房之前,教师应当先检查学生是否已经准备了这些内容,并将准备情况作为该次上机作业成绩的一部分或不允许上机。

经过上机作业,学生还应当提交作业报告。作业报告包括如下内容: 

(1) 上机作业时发现的问题。

(2) 对于发现的问题采取的调试方法。

(3) 对自己所准备文档中给出的测试用例的评价。

(4) 程序运行结果分析。

(5) 编程心得。

4. 思考探索

建构主义提倡,学习者要用探索法和发现法去建构知识的意义,学习者要在意义建构的过程中主动地搜集和分析有关的信息资料,对碰到的问题提出各种假设并努力加以验证。按照这一理论,本书还提供了一个探索思考栏目,以培养学习者获取知识的能力和不断探索的兴趣,同时可以从更深层次上探究Java语法。

(四)

写书难,写教材更难。一本专著,仅用于表达自己的见地;而一本好的教材,不仅是科学技术知识和方法的精华,还应当是先进教育理念的结晶。离这些,我还差得很远,好在有二十余年教学的经历和不断进行教学改革探索的积累,以及许多热心者的支持和帮助。

在此,我要衷心感谢在这本书的编写中参加了一定工作的下列人员: 姚威、陶利民、张展为、郎贵义、李磊、董兆军、张秋菊、史林娟、文明瑶、黄姝敏、陈觉、张友明、宋文炳、许剑生、贺竞峰等。此外,还要感谢清华大学出版社为本书出版所做的大量平凡而细致的工作。

本书就要出版了。它的出版是我在这项教学改革工作中跨上的一个新的台阶。我衷心希望能得到有关专家和读者的批评和建议,也希望结交一些志同道合者,把这项改革推向更新的境界。

张基温2013年5月