【面向对象】三大特性:封装(定义、作用、实现方式)

考点频率 :★★★★★(基础中的基础,选择题必考,也是理解"高内聚低耦合"的底层逻辑)

难度 :⭐

建议:重点理解"封装是为了隔离变化"这句话,不要死记硬背定义

1️⃣ 封装不是"把代码包起来",而是"管住手"

上篇文章咱们说到,对象 = 属性 + 方法。但有一个关键问题:谁可以碰这些属性和方法?

想象一个场景:你有一个银行账户对象,里面有属性"余额(balance)",有个方法"取钱(withdraw)"。

如果没有任何限制,其他代码可以直接这样干:

你的账户.余额 = 你的账户.余额 - 10000(直接改余额,绕过了取钱方法里的密码验证和风控逻辑)

这就相当于:你家的门锁(方法)还没起作用,小偷直接穿墙(修改属性)就把钱拿走了。

封装的本质,就是给对象的属性和方法设置"门禁系统"------哪些数据可以对外公开,哪些必须藏起来不让别人乱碰。

2️⃣ 封装的定义(背下来,但别只背字面)

定义 :封装是将数据(属性)基于数据的操作(方法) 捆绑在一起,形成一个独立的单元(类),并且尽可能隐藏对象的内部实现细节,只对外提供有限的接口(方法)与外部进行交互。

通俗地说,封装干了三件事:

  1. 打包:把数据和操作放在一起(你定义了一个类)。
  2. 隐藏 :把内部实现藏起来(比如用 private 修饰属性,不让外部直接访问)。
  3. 暴露 :只提供必要的公共方法(比如 publicgetBalance()withdraw())。

一句话人话你只管按遥控器的按钮(调用公共方法),不需要知道遥控器里面的电路板怎么走线(内部实现)。

3️⃣ 封装的作用(软考高频考点------为什么需要封装?)

封装不是为了让代码"好看",它有实实在在的工程价值。软考中常考以下三个核心作用:

作用 说明 现实类比
安全性(控制访问) 防止外部代码随意修改对象内部的关键数据,保证数据完整性 银行柜员不能直接修改后台数据库,必须通过业务系统流程操作
隔离变化(降低影响) 只要接口(方法名、参数)不变,内部实现随便改,调用方完全不受影响 你换了一台新路由器,只要WiFi密码和名称不变,手机不需要任何设置改动
简化使用(降低复杂度) 使用者只需要知道"调用哪个方法",不需要理解"方法内部怎么实现" 你开车只需要踩油门和刹车,不需要知道发动机内部的点火时序

4️⃣ 封装的具体实现方式(代码怎么落地?)

面向对象语言(如Java、C++、C#)主要通过访问控制修饰符(Access Modifiers) 来实现封装。

修饰符 访问范围(谁可以碰?) 在封装中的角色
private(私有) 本类内部可以访问 核心武器:用来隐藏属性,坚决不允许外部直接访问
protected(受保护) 本类 + 同包 + 子类可以访问 给"继承"留后门,允许子类扩展
public(公共) 任何人都可以访问 用来暴露接口方法 (如 getter/setter、业务方法)
default(默认/包级) 本包内的类可以访问 在软考中较少强调,了解即可

经典实现模式(Java/C#风格)

  • 属性用 private 修饰(藏起来)。
  • 提供 publicgetXxx() 方法(允许读取)和 setXxx() 方法(允许修改,且可在方法内部加校验逻辑)。

示例(伪代码,考试不会考具体语法,但逻辑要懂):

复制代码
class 银行账户 {
    private 余额;          // 藏起来
    private 密码;          // 藏起来

    public 查询余额() {    // 公开的接口
        return 余额;
    }

    public 取钱(请求金额) { // 公开的接口
        if (请求金额 <= 余额) {
            余额 = 余额 - 请求金额;
        } else {
            报错("余额不足");
        }
    }
}

外部只能调用 取钱(),不能直接写 账户.余额 = 0。这就叫封装。
软考记忆点属性通常设为 private,方法根据需求设为 public/protected

5️⃣ 易混淆点(封装的误解)

误解 正确理解
封装就是"把一堆代码放在一个文件里" ❌ 那叫物理聚合 ,不是封装。封装的核心是访问控制信息隐藏
封装就是私有化属性 ❌ 不完全是。私有化属性是实现封装的手段,不是封装的最终目的。最终目的是隔离变化、保护数据
封装和继承是矛盾的 ❌ 不矛盾。protected 就是为了在封装的前提下支持继承而生的

6️⃣ 经典例题

例题1:以下关于封装的说法中,错误的是( )。

A. 封装将数据和操作数据的方法绑定在一起

B. 封装的主要目的是提高代码的执行速度

C. 封装通过访问控制机制隐藏内部实现细节

D. 封装有利于降低模块间的耦合度

解析 :封装的主要目的是安全性、隔离变化和降低复杂度 ,而不是提高执行速度(那通常是算法优化或编译优化的工作)。选 B


例题2 (场景题):某系统对订单类进行了封装,将订单金额属性设为 private,并提供了 public修改金额() 方法,该方法内部包含日志记录和权限校验。这种做法带来的好处是( )。

A. 提高了金额的读写速度

B. 允许外部代码绕过校验直接修改金额

C. 在不影响外部调用的情况下,可以修改校验逻辑

D. 减少了代码的总行数

解析 :封装实现了隔离变化 。将来校验规则变了,只需要改 修改金额() 方法内部代码,所有调用它的外部代码完全不受影响。A错误(加了校验反而慢一点);B说反了;D无直接关系。选 C

7️⃣ 记忆口诀

属性私有藏里面,方法公开给外面。

内部逻辑随便换,外部调用永不变。

8️⃣ 小测验(评论区对答案)

以下关于面向对象封装的说法,正确的是( )。

A. 封装意味着所有属性都必须是 public 的

B. 封装的主要目的是让代码更难以阅读

C. 封装通过访问控制修饰符(如 private)来隐藏内部数据

D. 封装只能用于属性,不能用于方法

🔔 本专栏日更,点击头像 → 专栏《软考中级高频考点》订阅,第一时间接收新内容

#软考中级 #软件设计师 #封装 #面向对象 #访问控制 #软考备考

相关推荐
FellAveal6 小时前
【Go语言入门学习笔记】Part18.工作池与WaitGroup(也即协程池)
笔记·学习·golang
xqqxqxxq7 小时前
Java Socket 多人聊天室(私聊+群聊)技术笔记(V4版本)
java·网络·笔记
龙仔7257 小时前
人大金仓OS_Core数据库自动备份实施笔记(银河麒麟Linux)
linux·数据库·笔记·备份·人大金仓
Z5998178418 小时前
c#软件开发学习笔记--Modbus-RTU通讯
笔记·学习·c#
quanjui10 小时前
【医学尝试】基于Segment Anything Model的医学图像分割研究:眼底OCT与X线胸片微调实战
人工智能·笔记·学习
小黄蚁10 小时前
FreeRTOS学习笔记(十二)
笔记·学习
茯苓gao10 小时前
嵌入式开发笔记:电机参数辨识与自学习完全指南——从电气参数到机械特性的深度解析
笔记·嵌入式硬件·学习
优化Henry11 小时前
学习笔记之VoNR语音业务注册流程
网络·笔记·学习·5g·信息与通信
摇滚侠11 小时前
《RocketMQ 官网》阅读笔记 RocketMQ 订阅 (Subscription)
笔记·rocketmq
风曦Kisaki13 小时前
Kubernetes(K8s)笔记Day03: Pod命名空间,标签,Pod 的调度,污点与容忍度,Pod 常见状态和重启策略,Pod 生命周期
linux·运维·笔记·docker·云原生·容器·kubernetes