1、面向对象程序设计与面向过程程序设计的区别想要知道面向对象程序设计与面向过程程序设计的区别,我们应先了解什么事面向对象程序设计,什么事面向过程程序设计,这样我们才能弄清他们之间的区别,下面我们就什么是面向对象程序设计和什么事面向过程程序设计展开论述。面向对象的基本概念:(1)对 象 。 对 象 是 人 们 要 进 行 研 究 的 任 何 事 物 , 从 最 简 单 的 整 数 到 复 杂 的 飞 机 等 均 可 看 作对 象 , 它 不 仅 能 表 示 具 体 的 事 物 , 还 能 表 示 抽 象 的 规 则 、 计 划 或 事 件 。 (2)对 象 的 状 态 和 行 为 。 对 象 具 有
2、 状 态 , 一 个 对 象 用 数 据 值 来 描 述 它 的 状 态 。 对 象 还 有 操 作 , 用 于 改 变 对 象 的 状 态 , 对 象 及 其 操 作 就 是 对 象 的 行 为 。 对 象 实 现 了 数 据 和 操 作 的 结 合 , 使 数 据 和 操 作 封 装 于 对 象 的 统 一 体 中 (3)类 。 具 有 相 同 或 相 似 性 质 的 对 象 的 抽 象 就 是 类 。 因 此 , 对 象 的 抽 象 是 类 , 类 的 具 体化 就 是 对 象 , 也 可 以 说 类 的 实 例 是 对 象 。 类 具 有 属 性 , 它 是 对 象 的 状 态 的 抽
3、 象 , 用 数 据 结 构 来 描 述 类 的 属 性 。 类 具 有 操 作 , 它 是 对 象 的 行 为 的 抽 象 , 用 操 作 名 和 实 现 该 操 作 的 方 法 来 描 述 。 (4)类 的 结 构 。 在 客 观 世 界 中 有 若 干 类 , 这 些 类 之 间 有 一 定 的 结 构 关 系 。 通 常 有 两 种 主 要 的 结构 关 系 , 即 一 般 -具 体 结 构 关 系 , 整 体 -部 分 结 构 关 系 。 一 般 具 体 结 构 称 为 分 类 结 构 , 也 可 以 说 是 “或 ”关 系 , 或 者 是 “is a”关 系 。 整 体 部 分 结
4、 构 称 为 组 装 结 构 , 它 们 之 间 的 关 系 是 一 种 “与 ”关 系 , 或者 是 “has a”关 系 。 (5)消 息 和 方 法 。 对 象 之 间 进 行 通 信 的 结 构 叫 做 消 息 。 在 对 象 的 操 作 中 , 当 一 个 消 息 发 送 给 某 个对 象 时 , 消 息 包 含 接 收 对 象 去 执 行 某 种 操 作 的 信 息 。 发 送 一 条 消 息 至 少 要 包 括 说 明接 受 消 息 的 对 象 名 、 发 送 给 该 对 象 的 消 息 名 ( 即 对 象 名 、 方 法 名 ) 。 一 般 还 要 对 参数 加 以 说 明 ,
5、 参 数 可 以 是 认 识 该 消 息 的 对 象 所 知 道 的 变 量 名 , 或 者 是 所 有 对 象 都 知道 的 全 局 变 量 名 。 类 中 操 作 的 实 现 过 程 叫 做 方 法 , 一 个 方 法 有 方 法 名 、 参 数 、 方 法 体 。面 向 对 象 的 特 征(1)对 象 唯 一 性 。 每 个 对 象 都 有 自 身 唯 一 的 标 识 , 通 过 这 种 标 识 , 可 找 到 相 应 的 对 象 。 在 对 象 的整 个 生 命 期 中 , 它 的 标 识 都 不 改 变 , 不 同 的 对 象 不 能 有 相 同 的 标 识 。 (2)抽 象 性 。
6、 分 类 性 是 指 将 具 有 一 致 的 数 据 结 构 (属 性 )和 行 为 (操 作 )的 对 象 抽 象 成 类 。 一个 类 就 是 这 样 一 种 抽 象 , 它 反 映 了 与 应 用 有 关 的 重 要 性 质 , 而 忽 略 其 他 一 些 无 关 内容 。 任 何 类 的 划 分 都 是 主 观 的 , 但 必 须 与 具 体 的 应 用 有 关 。 (3)继 承 性 。 继 承 性 是 子 类 自 动 共 享 父 类 数 据 结 构 和 方 法 的 机 制 , 这 是 类 之 间 的 一 种 关 系 。在 定 义 和 实 现 一 个 类 的 时 候 , 可 以 在 一
7、 个 已 经 存 在 的 类 的 基 础 之 上 来 进 行 , 把 这 个已 经 存 在 的 类 所 定 义 的 内 容 作 为 自 己 的 内 容 , 并 加 入 若 干 新 的 内 容 。 继 承 性 是 面 向 对 象 程 序 设 计 语 言 不 同 于 其 它 语 言 的 最 重 要 的 特 点 , 是 其 他 语 言所 没 有 的 。 在 类 层 次 中 , 子 类 只 继 承 一 个 父 类 的 数 据 结 构 和 方 法 , 则 称 为 单 重 继 承 。 在 类 层 次 中 , 子 类 继 承 了 多 个 父 类 的 数 据 结 构 和 方 法 , 则 称 为 多 重 继 承
8、 。 在 软 件 开 发 中 , 类 的 继 承 性 使 所 建 立 的 软 件 具 有 开 放 性 、 可 扩 充 性 , 这 是 信 息组 织 与 分 类 的 行 之 有 效 的 方 法 , 它 简 化 了 对 象 、 类 的 创 建 工 作 量 , 增 加 了 代 码 的 可重 性 。 采 用 继 承 性 , 提 供 了 类 的 规 范 的 等 级 结 构 。 通 过 类 的 继 承 关 系 , 使 公 共 的 特 性能 够 共 享 , 提 高 了 软 件 的 重 用 性 。 (4)多 态 性 (多 形 性 ) 多 态 性 是 指 相 同 的 操 作 或 函 数 、 过 程 可 作 用
9、于 多 种 类 型 的 对 象 上 并 获 得 不 同 的结 果 。 不 同 的 对 象 , 收 到 同 一 消 息 可 以 产 生 不 同 的 结 果 , 这 种 现 象 称 为 多 态 性 。 多 态 性 允 许 每 个 对 象 以 适 合 自 身 的 方 式 去 响 应 共 同 的 消 息 。 多 态 性 增 强 了 软 件 的 灵 活 性 和 重 用 性 。面 向 过 程 程 序 设 计面 向 过 程 就 是 分 析 出 解 决 问 题 所 需 要 的 步 骤 , 然 后 用 函 数 把 这 些 步 骤 一 步 一 步 实 现 ,使 用 的 时 候 一 个 一 个 依 次 调 用 就
10、可 以 了 。 例 如 五 子 棋 , 面 向 过 程 的 设 计 思 路 就 是 首先 分 析 问 题 的 步 骤 : 1、 开 始 游 戏 , 2、 黑 子 先 走 , 3、 绘 制 画 面 , 4、 判 断 输 赢 ,5、 轮 到 白 子 , 6、 绘 制 画 面 , 7、 判 断 输 赢 , 8、 返 回 步 骤 2, 9、 输 出 最 后 结 果 。把 上 面 每 个 步 骤 用 分 别 的 函 数 来 实 现 , 问 题 就 解 决 了 。 面向过程是在面向对象出现之前,以及之后,甚至至今都应用于程序开发中的程序设计思想。面向过程就是分析出解决问题所需要的步骤,然后用函数把这些步骤
11、一步一步实现,使用的时候一个一个依次调用就可以了。面向对象是把构成问题事务分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描叙某个事物在整个解决问题的步骤中的行为。如:一辆汽车用面向过程的思想去考虑它应该是这样的:如何启动汽车、如何起步、加速、刹车、熄火等一个个操作。而汽车在这里并不是我们所关心的。而面向对象则以汽车为对象,一切由汽车开始,以上的可用操作,即功能是汽车这个对象本身所具有的,做任何操作只要告诉汽车就可以了。面向过程是把所有的功能全部在一个大的类里定义出来,当系统庞大时,功能多了,各种操作之间的调用关系也很复杂,当需要修改一个功能时就可能引发一连串的改动,使修改和维护成
12、本很昂贵。我们经常所说的“对象”,一般指的是解决信息领域内所遇到问题的方法。特别是应用软件技术来解决问题的方法。如我们经常碰到的面向对象的编程(Object-Oriented Programming)、面向对象的分析(Object-Oriented Analysis)、面向对象的设计(Object-Oriented Design)等。应用前面所介绍的关于对象的概念,可以对这些问题做进一步的分析。在面对较复杂的系统,我们可以将它作为一个对象来进行分析。一个系统(解决某个问题的全套解决方案)作为一个对象,可以由多个部分组成。同样,这个对象也可以由多个对象组成。对于同类的事物,可以由一个对象来表示。
13、这样做的益处是显而易见的,它灵活而高效,可以大大减轻设计人员的工作量,简化实际的模型。举一个例子。在关系型数据库的设计当中,我们可以把一个元组当作对象,给它定义一组操作方法。这些方法将适用于所有元组,从而我们不必在更大的范围内去细致的考虑不同的元组(如判断一个元素是否合法):因为它们有一组公共的面向本身的方法,它们“自己”可以“解决”自己的问题。更上一层的对象可以是一个表、视图等。表对象在元组对象的基础上又有它们自己的方法,如增加、删除等。从这个层面上讲,它也只需要做“自己”的事情,因为有元组对象的支持,它无须去考虑像元素是否合法这类的事情。甚至,有时为了满足我们还可以将元素或表群当作时对象并
14、定义它们自己的方法。这样,更能显示面向对象的优势。可以明显地看出,面向对象是以功能来划分问题,而不是步骤。同样是绘制棋局,这样的行为在面向过程的设计中分散在了总多步骤中,很可能出现不同的绘制版本,因为通常设计人员会考虑到实际情况进行各种各样的简化。而面向对象的设计中,绘图只可能在棋盘对象中出现,从而保证了绘图的统一。功能上的统一保证了面向对象设计的可扩展性。比如我要加入悔棋的功能,如果要改动面向过程的设计,那么从输入到判断到显示这一连串的步骤都要改动,甚至步骤之间的循序都要进行大规模调整。如果是面向对象的话,只用改动棋盘对象就行了,棋盘系统保存了黑白双方的棋谱,简单回溯就可以了,而显示和规则判
15、断则不用顾及,同时整个对对象功能的调用顺序都没有变化,改动只是局部的。再比如我要把这个五子棋游戏改为围棋游戏,如果你是面向过程设计,那么五子棋的规则就分布在了你的程序的每一个角落,要改动还不如重写。但是如果你当初就是面向对象的设计,那么你只用改动规则对象就可以了,五子棋和围棋的区别不就是规则吗?(当然棋盘大小好像也不一样,但是你会觉得这是一个难题吗?直接在棋盘对象中进行一番小改动就可以了。)而下棋的大致步骤从面向对象的角度来看没有任何变化。当然,要达到改动只是局部的需要设计的人有足够的经验,使用对象不能保证你的程序就是面向对象,初学者或者很蹩脚的程序员很可能以面向对象之虚而行面向过程之实,这样
16、设计出来的所谓面向对象的程序很难有良好的可移植性和可扩展性。面向对象和面向过程的区别,实在是难用一两句话说明白。面向过程是一种直接的编程方法,它是按照编程语言的思路考虑问题。尤其是想 C 语言这种过程式语言,它就是通过顺序执行一组语句来实现一个功能,这些语句的执行过程就是整个程序。不同的语言解决同一个问题的过程是不一样的。面向对象是一种抽象度更高的编程方法。它把眼光集中在了要解决问题本身而不是语言上。它的目标是使模块的抽象度更高,可复用性更好。面向对象的目的就是可复用。举个例子,比如我们要写一个计算器程序。这个计算机目前只要求有加减乘除四种运算。用面向过程的方法,我们可能直接就写一个 main
17、 函数。然后就开始定义一些数据结构,然后就开始写 add,sub,multi,div 等函数,去实现功能。用面向对象的方法,我们会先定义一个 Calculator 类。然后定义一些必要的数据成员,然后在定义 add,sub,multi,div 这四个成员函数(这四个函数的功能实现和上面四个应该是基本一样的) 。从上面的实现来看,这两种实现方法的差别不是很大,甚至第二种看上去还有些多此一举。接下来,我们要扩展这个计算器,让它能计算指数。用面向过程的方法,我们会将上面实现的代码全部 copy 过来,然后再增加一个 power函数。用面向对象的方法,我们会定义一个 CalculatorEx 类公有继
18、承自 Calculator,再在CalculatorEx 中实现 Power 函数。上面只是一个简单的扩展,二者的区别就明显起来。面向过程是纯代码级的复用。面向对象的复用方式更为优雅,它可以是代码级的,也可以是类级的,也可以是接口级的,也可以是组件级的,甚至是服务级的。抛下这些复用概念不说。我们假设第一次实现的并不是简单的四个功能,而是一个复杂的库,第二次增加的也不是一个功能而是一个扩展库。这时候面向对象的优势就会比较明显的体现出来。面向过程是松散部件,而面向对象是一个体系。我说的这些都是自己的理解,可能并不完全正确。对于面向对象有一个官方的定义,但是不同人有不同的理解。所以里面的很多东西都需要在学习的过程中去理解体会。但是,如果不动手做点东西,对这些概念很难理解到位。还有就是,C,C+,Java 这些都是语言,他们之间并没有是不是面向对象的区别。用C 同样可以写面向对象的程序,看看 Linux 的内核代码就知道了。C+,Java 一样可以写面向过程的程序,他们之所以叫面向对象的编程语言是因为他们提供的语言特性更易于实现面向对象的编程方法,并不是说他们只能做面向对象编程。还有就是并不是说面向对象一定优于面向过程。在很多领域是无法实施面向对象的方法,如硬件编程和嵌入式编程这种实时性和效率要求高的领域就无法用到面向对象。面向对象的主要领域还是用在大型,复杂型的软件系统中。