封装是面向对象编程中具有明确动作路径的实践行为,核心为隐藏数据、管控访问、验证修改;通过访问修饰符划定边界,提供带校验逻辑的 getter/setter 接口,将业务规则内聚于类中,并借助构造函数保障初始状态合法。

封装在面向对象编程中不是概念摆设,而是有明确动作路径的实践行为。核心就三点:把数据藏起来、把访问管起来、把修改验起来。
用访问修饰符划清内外边界
这是落地的第一步,也是最基础的硬性约束。在 Java、C#、Python(通过命名约定或 property)、Android 等主流环境里,都支持将字段声明为 private(或 Python 的双下划线前缀),确保外部代码无法直接读写。
- Java 中写 private String accountNo;,外部连点号都点不出来
- Python 中写 self.__balance = 0,直接访问会报 AttributeError
- PLC 编程(如 TIA Portal 面向对象扩展)中,通过“属性可见性”设置为 Private 或 Internal 实现类似控制
提供受控的公共接口(Getter/Setter)
不让人直接碰数据,但得给人用——所以必须配套提供规范的访问入口。这不是简单地“加个 get/set”,而是带逻辑的桥梁。
- setter 中加入校验:年龄不能为负、账户余额不能为负、IP 地址格式需合法
- getter 中可做计算或转换:比如 getFormattedName() 返回 “姓+名(首字母大写)”,而非裸字段
- 避免暴露内部结构:例如不返回原始 List 引用,而返回 Collections.unmodifiableList(list) 防止外部篡改
把业务规则沉到类内部,而不是散落在调用处
封装的高阶落地,是把“什么能做、怎么做、什么不能做”的判断权收归类自身。外部只说“我要取款”,不负责判断余额够不够、是否冻结、是否超日限额。
- 银行账户类里写 withdraw(double amount),内部自动检查余额、更新流水、触发风控回调
- PLC 设备类中定义 startMotor(),方法内先确认急停信号、再检查润滑状态、最后才置位输出,调用方只需传参,不操心顺序和条件
- Android 的 User 类中 updateProfile() 方法统一处理头像压缩、字段非空校验、网络请求封装,UI 层只管点按钮
配合构造函数完成初始态防护
封装不止管“改”,也管“生”。对象一创建,就必须处于合法、可用的初始状态。
- 构造函数强制传入必要参数(如设备 ID、用户 token),避免出现 null 或未初始化字段
- 在构造中做一次合法性检查:比如传入的“最大温度阈值”不能低于最小阈值
- 对可变参数做防御性拷贝:接收 List 时用 new ArrayList(input),防止外部后续修改影响对象内部状态










