Java封装的核心是字段私有化(private)并配合受控的getter/setter:getter可依需设为public/protected/package-private,setter按需提供且常含校验,final字段仅需getter。

Java 中访问修饰符与 getter/setter 的配合,核心目标是实现封装:把字段设为 private,再通过 public(或受控的 protected/package-private)方法提供安全、可控的访问入口。
字段一律用 private
这是封装的起点。无论是否需要外部读写,字段本身都不应暴露给其他类。
- 避免直接访问破坏对象状态(比如给 age 赋值 -5)
- 防止子类意外覆盖或误用字段
- 为将来加校验、日志、懒加载等逻辑留出空间
getter 通常用 public,但可按需降级
如果只希望本包内读取,就用 package-private(不写修饰符);如果只允许子类读取,用 protected;极少情况才用 private(仅限内部工具方法)。
- public int getAge() { return age; } → 大多数场景
- int getId() { return id; } → 同包可用,外部不可见
- protected String getName() { return name; } → 子类可用,无关类不可见
setter 按需开放,常带校验逻辑
不是每个字段都需要 setter。只读字段(如 ID、创建时间)可省略;需要修改的字段,setter 应做必要检查。
立即学习“Java免费学习笔记(深入)”;
- public void setAge(int age) { if (age 150) throw new IllegalArgumentException(); this.age = age; }
- 不提供 setName() → 字段只在构造时设定,之后不可变
- protected void setInternalState(String s) → 仅子类可修改内部状态
注意 final 字段与不可变对象
如果字段是 final,通常只提供 getter,不提供 setter;若整个对象设计为不可变(如 String、LocalDate),连 setter 都不该存在,所有状态由构造器传入。
- private final String code;
- public String getCode() { return code; } → 合理
- 没有 setCode(...) → 正确,final 不允许修改


















