Java 教学中面向对象编程思想的培养


2006 年 12 月 山西财政税务专科学校学报 Dec. 2006 第 8 卷 第 6 期 Journal of Shanxi Finance and Tax College Vol. 8 No. 6 =教学改革与管理> Java 教学中面向对象编程思想的培养 王建虹 ( 山西省财政税务专科学校, 山西 太原 030024) 摘 要: 本文从面向对象编程技术的概念、特征以及面向对象的程序设计方法出发, 结合 Java 语言的教学内容, 从 Java 语言的培养优势、教学内容的结合等方面探讨了如何把面向对象编程技能 在 Java 教学过程中得到培养的思想。 关键词: 面向对象; Java; 编程思想; 培养 中图分类号: G642. 424 文献标识码: B 文章编号: 1008- 9306( 2006) 06- 0075- 03 一、引言 面向对象方法学的基本原则是在用计算机解决 问题时, 按人们通常的思维方式建立问题域的模型, 设计尽可能自然地表现求解方法的软件。因此, 采 用了面向对象的方法后, 软件不仅易于被人理解, 而 且易于维护和修改, 从而提高了软件的可靠性和可 维护性; 同时, 可以提高公共问题域中软件模块化和 重用化的可能性。 在面向对象的设计方法中, 对象( object) 和消息 传递( message passing) 分别是表现事物及事物间相 互联系的概念, 类( class) 和继承( inheritance) 是适应 人们一般思维方式的描述范式, 方法( method) 是允 许作用于该类对象上的各种操作, 这种对象、类、消 息和方法的程序设计范式的基本点在于对象的封装 性( encapsulation) 和继承性。通过封装能将对象的 定义和对象的实现分开; 通过继承能体现类与类之 间的关系, 以及由此带来的实体的多态性( polymor- phism) , 从而构成了面向对象的基本特征。面向对 象技术已成为目前最为流行的一种软件开发方法。 而 Java 不仅是一门语言, 它已经成为一门技 术, 是适合于分布式计算环境的面向对象的编程语 言, 具有高度的安全性、可移植性和代码复用性。在 西方发达国家里, 几乎所有著名的高校都先后开设 了有关 Java 技术的课程, 在我国已经掀起使用 Java 的热潮, 特别是 Java2 出现以后, J2EE 已经成为企 业运算、电子商务等领域中相当热门的技术。在 Ja- va 教学内容中涉及了面向对象的概念和特点, 但是 如何结合 Java 教学内容找出面向对象技能培养的 结合点和突破口则是双方面升华的关键。本文结合 在 Java 教学过程中的体会, 提出如何在 Java 学习中 培养学生面向对象的编程思想。 二、加强面向对象基本概念和 Java 程序设计的 结合 Java 教学的目的, 一方面使面向对象的编程技 能得到训练, 另一方面, 掌握 Java 的编程方法, 在所 有的 Java 教材中, 都含有面向对象的基本内容, 而 在教学内容和方法上, 要把握两者之间的渗透性和 相互作用性。 ( 一) 加强面向对象特征的认识 我们是以面向对象的程序设计方法来进行 Java 程序设计的, 所以在 Java 中要以面向对象的思想来 分析问题和解决问题, 首先把握面向对象的基本概 念和特征, 然后严格遵循面向对象的设计思想来进 行编程训练。从面向对象设计的优点出发, 引导程 收稿日期: 2006- 09- 27 作者简介: 王建虹( 1964- ) , 女, 山西清徐人, 山西省财政税务专科学校经济信息系副主任、副教授, 研究方向: 网络数据库、移 动 Agent。 75 序设计思路: 可重用性使我们在应用程序中大量采 用成熟的类库, 从而缩短开发时间。继承和封装性 使我们要分析直接表现组成问题区域的事物以及这 些事物间相互联系, 易于程序的维护、更新和升级。 ( 二) 发掘教学内容的结合点 在 Java 教学中, 综观教学内容, 除了 Java 的基 本语法之外, 都是以 Java 提供的强大 API 类为主要 学习内容, Java 类都包含在不同的包中, 我们可以把 经常应用的字符串 String 类作为突破点, 提高学生 对概念的理解和类方法的正确使用的能力。所有语 言中都涉及对字符串的处理, 如 Delphi 和 C 语言 中, 用函数实现子字符串的获取, 而在面向对象设计 中则以类的方式提供, 对字符串对象进行了封装, 在 该类中提供了大量的方法, 如 charAt( ) 、substr( ) 等 等, 我们把它作为成熟的类, 在任何应用程序中都可 以通过创建 String 对象而实现对字符串的相关操 作, 我们只关心如何正确使用该类中的方法而不关 心方法的内部实现过程。通过 String 类的学习和比 较, 使学生对类封装的实质、类封装的作用和意义、 类的正确引用都有一个清晰的认识, 对后边的学习 起到抛砖引玉的作用。 在 String 类学习的基础上, 后续的 Java 类, 如 线程、异常、输入/ 输出、网络编程等都是以掌握这些 类的作用和技术应用为目的的, 我们都可以应用系 统提供的类而完成自己的任务, 以缩短开发周期, 必 要时我们还可以通过继承等方法建立自己的类库 等, 便于扩充自己的功能类。 ( 三) 改变观念、转变思路 C 语言作为基础课程而首先开设, 它培养了学 生的基础编程能力, 它是面向过程的, 在后续教学上 向面向对象的设计思想转变, 如 C + + 、Visual C+ + 等, 同样在 Java 中我们也要进一步转变设计 思路, 例如在求阶乘值的示例中, 我们不妨打破直接 解决问题的方法, 从两种程序的设计出发而完成思 想的转变。一是面向过程的实现: 在类中直接在 main 方法中, 通过初值的设计、结果的计算、结果的 输出来完成问题的处理, 但是这种模式是完全面向 问题而求解的, 没有把面向对象的设计方法考虑进 去。二是以面向对象的问题分析进行实现: 把阶乘 看做一个对象, 而所有阶乘问题抽象为类, 该类用 final 修饰而不能再被继承, 除了构造方法外, 运用 方法重载机制设计两个阶乘值计算方法: 非静态不 带参数的方法和静态带参数的方法, 这样在应用程 序中就可以通过类名或者类对象两种方法实现阶乘 值的计算, 增加了类应用的灵活性。通过对简单问 题的分析和解决就能达到掌握 static 修饰符的作用 和方法重载应用的目的。所以, 观念的形成和经验 的积累有利于面向对象编程技能的培养。 三、用面向对象的思维方法指导 Java 程序的 开发 很多同学对 Java 的面向对象的特性琢磨良久, 自认为有所领悟, 也开始有意识地运用 OOP 风格来 写程序, 然而还是经常会觉得不知道应该怎样提炼 类, 面对一个具体的问题的时候, 会觉得脑子里千头 万绪的, 不知道怎么下手, 一不小心, 又会回到原来 的思路上去。 例如要实现这样一种功能: 要发广告邮件, 广告 邮件列表存在数据库里面。倘若用 C 来写的话, 一 般会这样思考, 先把邮件内容读入, 然后连接数据 库, 循环取邮件地址, 调用本机的 qmail 的 sendmail 命令发送。然后考虑用 Java 来实现, 既然是 OOP, 就不能什么代码都塞到 main 过程里面, 于是就设计 了三个类: 一个类是负责读取数据库, 取邮件地址, 调用 qmail 的sendmail 命令发送; 一个类是读邮件内容, M IME 编码成HTM L 格 式的, 再加上邮件头; 一个主类负责从命令读参数, 处理命令行参数, 调用发 email 的类。 把一件工作按照功能划分为 3 个模块分别处 理, 每个类完成一件模块任务。 仔细地分析一下, 就会发现这样的设计完全是 从程序员实现程序功能的角度来设计的, 或者说, 设 计类的时候, 是自低向上的, 从机器的角度到现实世 界的角度来分析问题的。因此, 在设计的时候, 就已 经把程序编程实现的细节都考虑进去了, 企图从底 层实现程序这样的出发点来达到满足现实世界的软 件需求的目标。 这样的分析方法其实是不适用于 Java 这样面 向对象的编程语言, 因为, 如果改用 C 语言, 封装两 个 C 函数, 都会比 Java 实现起来轻松得多, 逻辑上 也清楚得多。面向对象的精髓在于考虑问题的思路 是从现实世界的人类思维习惯出发的, 只要领会了 这一点, 就领会了面向对象的思维方法。举一个非 常简单的例子: 假使现在需要写一个网页计数器, 客 户访问一次页面, 网页计数器加 1, 计数器是这样来 访问的 http: / / hostname/ count. cgi? id= xxx。 后台有一个数据库表, 保存每个 id( 一个 id 对 76 应一个被统计访问次数的页面) 的计数器当前值, 请 求页面一次, 对应 id 的计数器的字段加 1( 这里我们 忽略并发更新数据库表, 出现的表锁定的问题) 。 如果按照一般从程序实现的角度来分析, 我们会 这样考虑: 首先是从HTTP GET 请求取到 id, 然后按 照id 查数据库表, 获得某 id 对应的访问计数值, 然后 加1, 更新数据库, 最后向页面显示访问计数。 现在假设一个没有程序设计经验的人, 他会怎 样来思考这个问题呢? 他会提出什么样的需求呢? 他很可能会这样想: 我需要有一个计数器, 这个计数器应该有这样 的功能, 刷新一次页面, 访问量就会加 1, 另外最好 还有一个计数器清 0 的功能, 当然计数器如果有一 个可以设为任意值的功能的话, 我就可以作弊了。 作为一个没有程序设计经验的人来说, 他完全 不会想到对数据库应该如何操作, 对于 HTT P 变量 该如何传递, 他考虑问题的角度就是我有什么需求, 我的业务逻辑是什么, 软件应该有什么功能。 按照这样的思路( 请注意, 他的思路其实就是我 们平时在生活中习惯的思维方式) , 我们知道需要有 一个计数器类 Counter, 有一个必须的和两个可选的 方法: getCount( ) / / 取计数器值方法 resetCounter( ) / / 计数器清 0 方法 setCount( ) / / 设计数器为相应的值方法 把 Counter 类完整的定义如下: public class Counter { public int getCount( int id) {} public void resetCounter( int id) {} public void setCount( int id, int currentCount) {} } 解决问题的框架已经有了, 来看一下如何使用 Counter。在 count. cgi 里面调用 Counter 来计数, 程 序片断如下: / / 这里从 HT TP 环境里面取 id 值 , Counter myCounter = new Counter( ) ; / / 获得 计数器 int currentCount = myCounter. getCount( id) ; / / 从计数器中取计数 / / 这里向客户浏览器输出 , 程序的框架全都 写好了, 剩下 的就是实现 Counter 类方法里面具体的代码了, 此时才去考虑具 体的程序语言实现的细节, 比如, 在 getCount( ) 方法 里面访问数据库, 更新计数值。 从上面的例子中看到, 面向对象的思维方法其 实就是我们在现实生活中习惯的思维方式, 是从人 类考虑问题的角度出发, 把人类解决问题的思维方 式逐步翻译成程序能够理解的思维方式的过程, 在 这个翻译的过程中, 软件也就逐步被设计好了。 在运用面向对象的思维方法进行软件设计的过 程中, 最容易犯的错误就是开始分析的时候, 就想到 了程序代码实现的细节, 因此封装的类完全是基于 程序实现逻辑, 而不是基于解决问题的业务逻辑。 面向对象的设计是基于解决业务问题的设计, 而不是基于具体编程技术的设计。如果说传统的面 向过程的编程是符合机器运行指令的流程的话, 那 么面向对象的思维方法就是符合现实生活中人类解 决问题的思维过程。 在面向对象的软件分析和设计的时候, 要提醒 自己, 不要一上来就去想程序代码的实现, 应该抛开 具体编程语言的束缚, 集中精力分析我们要实现的 软件的业务逻辑, 分析软件的业务流程, 思考应该如 何去描述和实现软件的业务。毕竟软件只是一个载 体, 业务才是我们真正要实现的目标。 但是在设计过程中, 心里却往往在担心, 如果我 完全不去考虑程序代码的实现的话, 那么我怎么知 道我的设计一定合理呢? 我怎么知道我设计的类、 接口一定可以实现呢? 所以经常可以看到的现象就 是: 在设计过程中, 虽然知道不能过早考虑代码实 现, 但是每设计一个类、一个接口, 心里都要不知不 觉地用自己熟悉的编程语言大概的评估一下, 看看 能否编出来, 因此, 一不小心就会又回到按照程序功 能实现的思路进行设计的老路上去了。 使用面向对象的思维方法, 其实是一个把业务 逻辑从具体的编程技术当中抽象出来的过程, 而这 个抽象的过程是自上而下的, 非常符合人类的思维 习惯, 也就是先不考虑问题解决的细节, 把问题的最 主要的方面抽象成为一个简单的框架, 集中精力思 考如何解决主要矛盾, 然后在解决问题的过程中, 再 把问题的细节分割成一个一个小问题, 再专门去解 决细节问题。 当然 Java 只是面向对象编程技术涉及的课程 之一, 理论是基础, 应用是目的, 在体系化的教学内 容设置基础上, 应该通过相关课程知识的融合和对 实际问题的系统设计而使学生的综合实践能力得到 培养。 ( 责任编辑 孔德瑾) 77
还剩2页未读

继续阅读

下载pdf到电脑,查找使用更方便

pdf的实际排版效果,会与网站的显示效果略有不同!!

需要 3 金币 [ 分享pdf获得金币 ] 0 人已下载

下载pdf

pdf贡献者

ayhandsome

贡献于2015-03-13

下载需要 3 金币 [金币充值 ]
亲,您也可以通过 分享原创pdf 来获得金币奖励!
下载pdf