Java封装本质是隐藏内部实现并暴露可控接口,通过private字段、public方法、访问修饰符、getter/setter校验及final不可变设计共同实现数据安全与状态一致性。

Java 中的封装,本质是把数据(属性)和操作数据的方法打包成一个独立单元,并隐藏内部实现细节,只暴露安全、可控的接口供外部使用。它不是单纯“加 private”,而是围绕“谁该看到什么、谁能改什么”建立一套清晰的访问边界。
封装的核心逻辑:隐藏 + 暴露
就像一台洗衣机——你按“快洗”按钮就能用,但不用知道电机怎么转、水位怎么控。Java 封装也一样:
- 把字段(如 name、balance)设为 private,切断外部直接读写路径;
- 提供 public 的方法(如 getName()、deposit())作为唯一入口,把校验、转换、日志等逻辑收拢进来;
- 让类自己掌控数据状态,避免外部误操作导致对象不一致(比如年龄设成 -5,余额被直接减成负数)。
访问修饰符就是封装的“门禁系统”
每个修饰符对应一种可见范围,选错就等于开错了门:
- private:最严的门,只允许本类内部访问。所有成员变量都应优先用它,这是封装的起点;
- public:敞开的大门,任何类都能调用。只用于真正需要被其他模块使用的业务方法或 API 入口;
- protected:带钥匙的侧门,同包类或不同包的子类可用。一般只在框架基类中预留扩展点(如 onCreate()),普通业务类少用;
- default(不写修饰符):包内自由通行。容易因包结构调整意外暴露,关键字段和方法别用它。
光靠修饰符不够,还得配 getter/setter
private 字段不是锁死,而是要求所有访问必须走统一通道:
立即学习“Java免费学习笔记(深入)”;
- setter 不只是赋值,要嵌入业务规则:比如设置邮箱时校验格式,设置库存时检查是否小于 0;
- getter 可以做脱敏处理:密码字段不提供 getPassword(),只提供 isPasswordSet();
- 别用 IDE 一键生成全部 getter/setter——有些字段(如内部计数器、缓存结果)根本不该对外暴露。
再加固一层:final 和不可变设计
封装不只是防“乱改”,更是防“误改”:
- 配置类声明为 final class Config,防止被继承破坏单例逻辑;
- 集合字段写成 private final List<String> tags,构造时初始化并包装成 Collections.unmodifiableList();
- 常量用 private static final int MAX_RETRY = 3,语义明确、运行期不可变。


















