封装是通过private字段+public getter/setter+类内行为方法实现数据与行为的统一管理。private封住直接访问,getter/setter校验读写,行为逻辑(如calculateFinalGrade)和构造器校验均纳入类内,确保状态可控、规则集中。

封装让数据和行为真正“绑定”在一个类里,而不是散落在各处。它不是简单地把字段和方法写进同一个 class 大括号,而是通过访问控制 + 方法封装,让数据只能按预设规则被读写、被操作,从而实现统一管理。
用 private 封住数据入口
所有关键属性必须声明为 private,这是统一管理的前提。一旦设为 private,外部代码就无法直接读写 name、age、score 这些字段——哪怕只是赋个值或打印一下,都必须走类内部定义的路径。
- 不加 private 的字段(如默认包权限或 public)等于敞开大门,任何地方都能随意修改,数据状态完全失控
- private 不是“不让用”,而是“只准按我的方式用”,为后续校验和逻辑集中埋下伏笔
用 getter/setter 做唯一出口和入口
对外暴露的 public 方法(尤其是 getXXX 和 setXXX)不是形式主义,而是统一管理的执行中枢:
- setAge(int age) 里可以强制检查:0 ≤ age ≤ 150,非法值直接拒绝或设默认值
- setName(String name) 可校验非空、长度 2–6、不含敏感字符等业务规则
- getScore() 可返回计算后的加权分,而非原始存储值;甚至根据用户角色决定是否返回真实成绩
把行为逻辑也收进类内部
封装不只是管字段,更要让操作这些字段的方法也归属同一主体。比如“学生期末总评”不应在 main 方法里拼接计算,而应作为 Student 类的一个 public 方法:
立即学习“Java免费学习笔记(深入)”;
- 错的做法:外部代码反复调用 getScore()、getAttendance() 再自己算总评
- 对的做法:Student 类提供 public double calculateFinalGrade(),内部整合规则、调用私有辅助方法、处理异常情况
- 这样所有与“学生成绩评定”相关的数据和逻辑都在一个地方,改规则只需动这个类,不会漏掉某处硬编码的计算
构造器也纳入封装体系
对象一创建就要受控,不能绕过校验直接 new 出非法状态的对象:
- 构造方法中调用 this.setName(name) 和 this.setAge(age),确保初始化阶段就走校验逻辑
- 避免直接给 private 字段赋值(如 this.name = name),否则会跳过 setter 中的合法性检查
- 必要时可将无参构造设为 private,强制使用者必须通过带参构造或工厂方法创建对象


















