用一个简单的比喻来帮助你理解:“如何完成一顿饭?”
1. 面向过程 (Procedural Oriented)
核心思想:关注“步骤”和“流程”。
这就像你拿到一份菜谱。你必须严格按照步骤来执行:
第一步:洗菜。
第二步:切菜(把土豆切成丝)。
第三步:开火、倒油。
第四步:放花椒、炒香。
第五步:放入土豆丝、翻炒...
...
最后一步:装盘。
特点:
以“函数”为中心: 整个程序就是由一个个的“函数”(function)组成的,就像菜谱里的一个个“步骤”。
数据和操作分离: “土豆”(数据)和“切菜”这个动作(函数)是分开的。你得自己调用 qieCai(tudou) (切菜) 这个函数,作用于“土豆”这个数据上。
思维方式: “我该如何一步一步地解决这个问题?”
C语言就是典型的面向过程语言。你定义各种变量(数据),然后编写各种函数来处理这些变量。程序的执行就是函数A调用函数B,函数B再调用函数C...
2. 面向对象 (Object Oriented)
核心思想:关注“谁”来做“什么事”。
这就像你开了一家餐厅。你不需要关心做饭的每一步,你只需要“指挥”不同的对象来完成他们的工作。
厨房里有:
一个“厨师”对象
一个“切菜工”对象
一个“服务员”对象
当一个“顾客”对象(他有“点菜”的方法)点了一份土豆丝时:
你(经理)对“服务员”对象说:fuwuyuan.jiedan(tudousi) (服务员去接单)。
“服务员”对象对“厨师”对象说:chushi.zuocai(tudousi) (厨师去做菜)。
“厨师”对象发现需要切菜,于是对“切菜工”对象说:qiecaigong.qiecai(tudou) (切菜工去切菜)。
特点:
以“对象”为中心: 整个程序是由一个个“对象”(object)组成的。
数据和操作绑定(封装): “厨师”这个对象,他自己拥有“厨艺”这个技能(方法/函数),也拥有“厨师等级”这个信息(数据/属性)。它们被“封装”在一起。你不需要知道厨师的刀法细节,你只需要告诉他“去做菜”,他自己就知道该怎么做。
思维方式: “我需要哪些对象?每个对象有什么功能和信息?它们之间如何协作?”
C++ 和 Java 就是典型的面向对象语言。你不再是写一步步的指令,而是先去“设计”和“定义”这些“对象”(在代码里叫 类 (Class)),比如设计一个 ChuShi (厨师) 类,定义他有什么属性(如:name, level)和什么方法(如:zuoFai(), yanfaXinCai())。
这是一个非常核心且重要的问题!
用一个简单的比喻来帮助你理解:“如何完成一顿饭?”
- 面向过程 (Procedural Oriented)
核心思想:关注“步骤”和“流程”。
这就像你拿到一份菜谱。你必须严格按照步骤来执行:
第一步:洗菜。
第二步:切菜(把土豆切成丝)。
第三步:开火、倒油。
第四步:放花椒、炒香。
第五步:放入土豆丝、翻炒...
...
最后一步:装盘。
特点:
以“函数”为中心: 整个程序就是由一个个的“函数”(function)组成的,就像菜谱里的一个个“步骤”。
数据和操作分离: “土豆”(数据)和“切菜”这个动作(函数)是分开的。你得自己调用 qieCai(tudou) (切菜) 这个函数,作用于“土豆”这个数据上。
思维方式: “我该如何一步一步地解决这个问题?”
C语言就是典型的面向过程语言。你定义各种变量(数据),然后编写各种函数来处理这些变量。程序的执行就是函数A调用函数B,函数B再调用函数C...
- 面向对象 (Object Oriented)
核心思想:关注“谁”来做“什么事”。
这就像你开了一家餐厅。你不需要关心做饭的每一步,你只需要“指挥”不同的对象来完成他们的工作。
厨房里有:
一个“厨师”对象
一个“切菜工”对象
一个“服务员”对象
当一个“顾客”对象(他有“点菜”的方法)点了一份土豆丝时:
你(经理)对“服务员”对象说:fuwuyuan.jiedan(tudousi) (服务员去接单)。
“服务员”对象对“厨师”对象说:chushi.zuocai(tudousi) (厨师去做菜)。
“厨师”对象发现需要切菜,于是对“切菜工”对象说:qiecaigong.qiecai(tudou) (切菜工去切菜)。
特点:
以“对象”为中心: 整个程序是由一个个“对象”(object)组成的。
数据和操作绑定(封装): “厨师”这个对象,他自己拥有“厨艺”这个技能(方法/函数),也拥有“厨师等级”这个信息(数据/属性)。它们被“封装”在一起。你不需要知道厨师的刀法细节,你只需要告诉他“去做菜”,他自己就知道该怎么做。
思维方式: “我需要哪些对象?每个对象有什么功能和信息?它们之间如何协作?”
C++ 和 Java 就是典型的面向对象语言。你不再是写一步步的指令,而是先去“设计”和“定义”这些“对象”(在代码里叫 类 (Class)),比如设计一个 ChuShi (厨师) 类,定义他有什么属性(如:name, level)和什么方法(如:zuoFai(), yanfaXinCai())。
总结对比
为什么会出现面向对象?
随着软件变得越来越复杂(比如从做一个简单的计算器,到做一个复杂的Windows操作系统),“面向过程”的方式暴露了巨大的问题:
- 难以维护: 想象一下,一个有10000个步骤的超级菜谱。如果第500步的“盐”要改成“糖”,你可能还需要修改第2000步和第8000步(因为它们都依赖于盐)。它们紧密地“耦合”在了一起。
- 难以复用: 你为“炒土豆丝”写了一套流程。现在你要“炒青椒肉丝”,你发现“切菜”、“倒油”、“翻炒”这些步骤很像,但你还是得把整个流程重写一遍。
而面向对象就是为了解决这些问题而生的: - 易维护(封装): 你只需要告诉“厨师”对象把土豆丝的“盐”改成“糖”。至于他内部具体怎么操作,是否影响其他步骤,那是他自己的事,你(经理)不用管。
- 易复用(继承): 你可以定义一个“炒菜机器人”的“父类”,它有“倒油”、“翻炒”等基本功能。然后让“炒土豆丝机器人”和“炒青椒肉丝机器人”都去继承这个父类,它们只需要添加自己独特的功能(比如“放土豆丝”或“放肉丝”)就行了,通用的功能不用重写