孔令旗
(焦作师范高等专科学校 教学督导办公室,河南 焦作 454000)
许多本专科院校把Java作为相关专业学生学习的第一门面向对象的计算机程序设计语言,但实际的教学效果并不理想。学生学完Java程序设计后,被要求编写一个运用面向对象机制,且规模很小的Java程序时,相当一部分人会感到困难重重,手足无措。一般来说,学习Java程序设计语言的困难来自以下三方面:
首先是面向对象机制与思维模式的内化
面向对象的基本思想认为世界是由各种各样具有自己的运动规律和内部状态的对象所组成的,不同对象之间的相互作用和通信构成了完整的现实世界。面向对象实现的机制包括封装性、继承性和多态性等。面向对象机制的理解、掌握,并运用到实际问题的解决过程中去,不可能通过简单几次课的教学来完成,需要教师有目的地教学与不断刻意地培养、训练才能逐步实现。
其次是专业的Java开发环境
初学者在DOS下用Java JDK来学习程序设计时,对各种DOS命令的理解、记忆与使用成为他们学习的梦魇。看不见摸不着的文件系统、类路径让他们不知所措;当初学者用面向专业程序员的集成开发环境,如Eclipse、NetBeans时,众多复杂的功能又让他们眼花缭乱,望而生畏。
再次是非母语表达
Java程序代码类似英文文章,程序编译时显示的错误信息是英文的,程序运行时的错误信息是英文的,Java的技术文档同样是英文的。对于英语基础薄弱的学生,特别是不少高职院校学生而言,学习Java程序设计显得尤为困难。
事实上BuleJ正是为破解这些难题而专门设计的。BlueJ是一个开源的Java集成开发环境,现由英国肯特大学计算机教育研究小组开发维护。准确地说,BlueJ是一个用于面向对象程序设计教学的工具软件,它具有交互性、可视性和简单性三个显著特点[1],Java之父詹姆斯·高斯林在谈到BlueJ时说:“我最喜欢的集成开发环境是BlueJ。”[2]
用BlueJ打开了一个项目,并设置显示代码面板,系统的Window界面如图1。
图1 BlueJ的窗口界面
图1主窗口中的类UML(Unified Modeling Language 统一建模语言)图勾勒出了项目中类与类之间的使用、继承关系,实现了类与类关系的可视化。类图标的右键菜单可以实现类的编辑、编译和删除,以及调用类的构造方法来创建对象;对象席存放用项目或系统类库中的类创建的对象图标,实现了对象的可视化。对象图标的右键菜单可以调用对象方法、查看对象状态和删除对象。这种交互性打破了原本只有程序才能对对象进行操控的程序运行模式,为类与对象的认识与理解、程序的迭代式设计以及基于类模块的调试提供了强有力的支持;在代码面板里直接输入Java语句或表达式后就能执行或计算,极大地方便了Java数据类型、变量、表达式和各种Java语法现象的教学;设置本地语言后,BlueJ可以用本地语言显示系统菜单与快捷按钮,并用本地语言显示编译错误信息和运行错误信息,对英语基础薄弱的初学者而言,降低了他们的学习难度。
BlueJ自20世纪90年代末问世以来,其软件版本在不断更新,2014年推出的最新版本为3.1.1。时至今日,它在计算机教育发达的西方和印度得到了广泛应用,而在我国的计算机教育中仍难觅BlueJ的踪迹。本文的目的在于探讨如何利用BlueJ的特点与优势,降低Java程序设计教学的难度,激发学生学习兴趣,培养学生的动手实践能力,强化训练面向对象的思维习惯,提高课堂与实验课教学效果,为学生后续专业课程的学习打好基础。
程序设计课程是一门实践性很强的课程,学生只有多动手、多实验,才能理解概念,掌握方法,练就技能,培养能力。教、学、做一体的教学模式[3]特别适合于程序设计课的教学。学生学习程序设计最大的动力是兴趣,而学生最感兴趣的因素是他们在教学实践活动中不断获得的成就感。BlueJ的操控性、即算性和可视性为教、学、做一体的实施提供了有力支撑。
程序设计教学中的实验活动可划分为验证型、模仿型、扩修型和独创型四种类型。新内容教学初期一般以验证型、模仿型实验为主,而中后期则以扩修型、独创型实验为主。
BlueJ自带了若干个项目的例子,存放在安装目录下的examples文件夹中。其中的shapes项目内包含Circle(圆)、Square(正方形)和Triangle(三角形)3个几何图形类,它们都使用了另一个Canvas(画布)类(参见图1)。每个类都设计有用于显示、隐藏、上下左右移动、水平垂直移动指定距离的public方法。这个直观图形的项目特别适合于介绍类、对象的概念,以及它们之间关系。
教师通过创建对象、调用方法、查看状态等一系列演示操作,揭示对象是由类创建的。一个类可以创建多个对象,用同一个类创建的多个对象有相同的方法,但一个对象的方法仅用于操纵该对象本身。尽管同一个类创建的对象有相同的一组字段,但每个对象的字段都有自己独立的存储空间,互不影响。教师演示完后可以给学生布置类似的操作实验任务,让学生体会、理解面向对象程序的实现机制,以及类和对象之间的关系,这种实验属于模仿型。
学习过构造方法的语法格式与作用之后,可给学生布置这样的实验:找出项目shapes中Circle类的构造方法,并阅读代码;希望圆默认用红色显示时,如何修改Circle的代码?为Circle增加一个构造方法,可以在创建对象时指定圆的直径。该实验不仅可以加深学生对构造方法的理解,培养代码阅读能力,而且让学生试着进行代码的改动与扩展。该实验属于扩修型。
用非BlueJ的Java环境教学时,数据类型、变量、表达式、赋值语句、强制类型转换等内容的教学大多都是纸上谈兵;在进行控制语句与系统类的教学,比如if、for、String时,只有将它们嵌入一个完整程序时才能看到一些效果,不能让学生充分体验与练习,不利于学生理解掌握Java的概念与规则。用BlueJ作为Java教学环境时,教师可以用代码面板充分演示讲解,学生可以用代码面板充分练习领会,教学也就不再枯燥乏味。
利用BlueJ平台易用、灵活的特点,精心设计并组织足量的教、学、做一体的教学活动,将对Java程序设计教学质量的提高产生积极影响。
对象优先就是在教学过程中尽可能早地引入对象的概念,使学生尽早接触、熟悉、理解、运用面向对象程序设计的概念与机制。20世纪末,对象优先的教学理念已经在西方开展实验性教学,而BuleJ的问世更进一步推动了对象优先教学理念的实施[1]。如今,对象优先在国外程序设计教学中已得到广泛应用。
利用BlueJ环境,学生接触对象,调用对象方法、查看对象状态可以早于Java语法和源代码的学习。在完成概述章节教学之后,用BlueJ打开前面已提到过的shapes项目,让学生认识BlueJ界面。以该项目为例介绍面向对象的基本机制,使学生看到对象是用类创建的,对象有方法,方法执行改变对象的状态,比如几何图形的颜色、位置等。通过教师的演示与学生的亲手实验,学生直观地感受了对象和类,体会到了方法代码执行的效果,知道了每一个方法都有其名字,可以通过参数向方法传递数据等。在以后的教学单元中,先引导学生阅读类代码,然后再在设计第一个类时介绍类代码的语法格式。
学生从观察感受、动手实验、阅读代码、规则学习,到自己编写代码,经历了从直观到抽象,从概要到细节的认知过程,不断深化了对类和对象的理解。在介绍Java各种语句和面向对象的机制时,要尽可能从项目设计需要出发加以引入,体现对象优先的理念,使概念、语法教学与项目设计融为一体。
项目驱动是当今流行的一种课程教学模式[4]。用传统的Java环境教学时,必须等介绍的程序设计知识累积到一定量后才能引进项目,而此后又会因教学课时数不足,使项目驱动实验草草收场,导致改革的作用不能充分发挥。BlueJ作为教学环境,特别适合于逐个类、逐个方法进行实验调试,所以BlueJ特别适合于初学者通过不断迭代、不断完善的途径来学习程序设计。
打号机可以作为教学用的第一个项目,它模拟银行、大型医院等场所为客户和病人打印接受服务的排队号码。把该项目放在介绍过了Java基本数据类型、赋值语句和类代码的格式后进行教学。教学过程中可以把构造方法、if语句、++与--运算等编程知识与该项目融合在一起,构成一个教学单元。
初始设计:代码中定义一个int字段nextNo存放下一次要打印的服务号码,一个方法getNextNo()返回号码,然后将号码加1。代码如下:
public class MarkingMachine {
private int nextNo;
public int getNextNo() {
int x = nextNo; }
nextNo = nextNo + 1;
return x; }
第1次迭代:用构造方法改变打印的第1个号为0以及从指定号打印起的问题;第2次迭代:引入++、--运算符解决先访问nextNo,后加1问题;第3次迭代:介绍System.out.println方法,输出号码到终端窗口;第4次迭代:介绍if语句,解决打印到指定号止的问题。
打号机项目之后,“锤子剪子布”游戏的模拟作为第二个项目,该项目实现对象间方法的交互调用,学习对象引用,传递对象参数,并复习强化if控制语句、System.out.println方法的应用。初始设计时,项目中有两个类,裁判类Referee的对象接受玩家类Player对象的出手数据,当裁判接收到两个不同玩家的数据后判断游戏的输赢。设计中分别用int值0,1,2对玩家出手数据“锤子,剪子,布”进行编码。甲、乙两玩家出手数据不相等时,条件“(甲数据 + 1) mod 3 = 乙数据”为真时甲胜,否则乙胜。
后续的迭代设计可以考虑解决:⑴ Referee用静态数据、静态方法实现;⑵ 用随机整数作为玩家出手数据。
以学生身边且他们感兴趣的事物为项目素材,一方面学生容易理解,对象分析容易做到水到渠成,使他们感到程序设计并不高深,并且可以解决一些实际问题;另一方面,有趣的例子也可以提高学生的学习兴趣。
BlueJ独特的优势使其成为介绍Java编程教学不可多得的教学工具。无论是采用传统的教学内容组织模式,还是想进行教学改革的尝试,BlueJ都会对Java程序设计的教与学起到重要且有效的帮助。事实上BlueJ是一个没有剪裁的Java标准环境,完全胜任Java小规模项目的开发设计。如果Java作为本专科学生的主干专业基础课,BlueJ适合于学生打基础阶段学习使用,学生最终还应掌握NetBeans、Eclipse等专业工具。NetBeans和BlueJ团队为了让学生从BlueJ平滑过渡到NetBeans,在NetBeans的一些版本上开发了BlueJ插件,安装BlueJ插件后NetBeans可以打开使用BlueJ项目。
[参考文献]
[1] Kölling M, Rosenberg, J. Guidelines for Teaching Object Orientation with Java[C]. Proceedings of the 6th conference on Information Technology in Computer Science Education (ITiCSE 2001). England Canterbury, 2001.
[2] BlueJ[EB/OL]. [2014-02-10].http://www.bluej.org.
[3] 郭英凯. 高职教育“教学做一体”教学模式创新研究[J]. 教育与职业, 2013(36):105-107.
[4] 刘波,沈岳,曾莹. 高校计算机项目驱动式教学模式探索[J]. 计算机教育, 2011(4):82-84.