10.1.1 面向对象基本概念介绍
面向对象基本概念在上午题中常以 2 到 4 分的形式出现,考得比较零散,但很容易拿分。它不是复杂算法题,主要考“概念名称和描述是否能配上”:对象、类、封装、继承、泛化、多态、动态绑定等。
面向过程与面向对象
结构化开发更偏面向过程:把问题分解成步骤,按过程一步一步求解。面向对象则先思考现实世界中有哪些“对象”,这些对象有什么属性、能做什么行为,然后让对象之间通过消息协作。
| 思维方式 | 关注点 | 典型问题 |
|---|---|---|
| 面向过程 | 步骤、算法、控制流程 | “先做什么,再做什么” |
| 面向对象 | 对象、职责、状态、行为、协作 | “系统里有哪些对象,它们如何配合” |
两者不是简单的好坏替代。面向过程适合清晰流程和算法表达;面向对象更适合把复杂系统组织成稳定的对象结构,提高复用、扩展和维护能力。
从现实世界到对象
面向对象常说“万物皆对象”。这句话不是说程序里真的把所有东西都照搬进来,而是说现实世界中的事物可以被抽象成程序对象。
抽象对象时,通常抓三部分:
| 组成 | 含义 | 例子 |
|---|---|---|
| 对象标识/对象 ID | 唯一识别这个对象 | 编号、名称、唯一主键 |
| 属性/状态/数据 | 静态特征 | 颜色、年龄、余额、状态值 |
| 行为/操作/方法 | 动态能力 | 叫、移动、付款、查询 |
对象不是只有数据,也不是只有函数,而是把数据和操作封装成一个整体。对象 ID 用来区分“这一只”和“另一只”;属性描述它当前是什么样;行为描述它能做什么。
mermaid
flowchart LR
R["现实世界事物"] --> A["抽象静态特征<br/>属性/数据"]
R --> B["抽象动态特征<br/>行为/操作"]
R --> ID["给出唯一标识<br/>对象ID"]
A --> O["对象"]
B --> O
ID --> O封装是什么
封装是把对象的属性和行为组织在对象内部,对外只暴露必要接口。它带来两个效果:
- 信息隐藏:外部不需要知道对象内部如何保存数据、如何实现操作。
- 访问控制:外部只能通过允许的接口使用对象,减少误用和耦合。
可以把封装理解为“对外给接口,对内藏细节”。这会提高安全性和可维护性,因为外部代码不直接依赖内部实现。
从对象到类
如果每创建一个对象都从头定义一遍属性和行为,会非常低效。因此要把一组相似对象的共同特征再抽象成“类”。
| 层次 | 含义 |
|---|---|
| 对象 | 具体个体,有具体属性值 |
| 类 | 一组相似对象的抽象模板 |
| 实例化 | 由类创建具体对象的过程 |
分析时常从现实世界出发:现实事物 -> 对象 -> 类。实现时方向相反:先写类,再由类实例化对象。
考试提醒
| 题干关键词 | 对应概念 |
|---|---|
| 具有属性、行为、唯一标识的运行实体 | 对象 |
| 一组相似对象的抽象模板 | 类 |
| 数据和操作放在一起,隐藏内部细节 | 封装 |
| 对象之间请求服务或调用方法 | 消息 |
| 类创建对象 | 实例化 |
容易错的一点:消息是对象之间的通信或方法调用,不是对象的组成部分。对象的组成更常表述为对象 ID、属性/状态、行为/操作。
例题
一组相似对象的抽象描述通常称为:
下列通常不属于对象组成部分的是:
本节小结
面向对象把系统看成对象之间的协作。对象由标识、属性和行为构成;封装把数据和操作放在一起并隐藏内部细节;类是一组相似对象的模板,实例化则由类创建具体对象。考试重点是概念配对和边界辨析。