java成员变量应默认用private修饰,结合业务意图选择访问修饰符;private防止外部绕过校验破坏状态,static字段需谨慎封装,getter/setter是逻辑入口而非模板,封装核心在于可控可管。

Java 中成员变量的访问控制,核心是“该藏的藏住,该给的给稳”——不是简单加个 private 就完事,而是要结合业务意图、继承关系和调用场景,选对修饰符、配好访问方式。
成员变量默认应声明为 private
绝大多数成员变量都该用 private 修饰。这不是为了“不让看”,而是防止外部绕过校验逻辑直接赋值,破坏对象状态一致性。比如用户年龄、账户余额这类有业务约束的字段,一旦开放直连,就可能被设成负数或超大值。
- private 变量只能在本类内部读写,子类也无权直接访问(需通过 public/protected 方法间接操作)
- 哪怕只是普通字符串或数字,也建议私有化——未来加校验、日志、监听时,只需改方法,不牵动调用方
- boolean 类型的 getter 命名为
isXxx()(如isActive()),而非getXxx(),这是 Java Bean 规范要求
static 字段要慎用,搭配 private 更安全
静态变量属于类本身,所有实例共享一份内存。若它又带业务含义(比如当前登录用户、订单计数器),就必须用 private static 封装,再配 public static getter/setter 控制入口。
- 避免把可变状态(如用户 session、购物车内容)设为 static,否则多个实例会互相覆盖
- private static final 常用于常量或单例工具(如
private static final Logger logger = ...) - 如果 static 字段是集合类(如
ArrayList),即使 private,外部仍能修改其内容——必要时要做防御性拷贝
按用途选对访问修饰符组合
修饰符不是孤立使用的,要和类的设计角色匹配:
- 工具类里的辅助方法(如字符串处理、日期转换)用 private,只供本类内部调用
- 父类中希望被子类重写、但不对外暴露的方法,用 protected;子类可访问,包外其他类不可见
- 构造器一般用 public,确保能被外部创建实例;若限制实例化(如单例),则设为 private
- 包内协作类之间若需共享某些配置或缓存,可用 default(不加修饰符),但跨包必须显式提供 public 接口
getter/setter 不是模板套用,而是逻辑入口
提供 get 和 set 方法,不是走形式,而是预留校验与扩展点:
- setAge(int age) 里可以判断范围(0–150)、记录修改时间、触发状态变更事件
- getName() 返回前可做空值处理(如返回空字符串而非 null),避免调用方 NPE
- 对于只读字段,只提供 getter,不写 setter;对于计算属性(如 fullName),getter 内部拼接,不单独存字段
- 使用
this.name = name;明确区分形参与成员变量,避免赋值失效
封装不是锁死一切,而是让每一次访问都有迹可循、可控可管。写得清楚,改得安心。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











