在 java 中,通过封装保护对象内部状态的核心做法是将字段声明为 private,并提供公开的 getter 和 setter 方法。这样做可以确保外部代码只能通过受控的接口访问或修改数据,从而防止非法赋值、保证数据一致性并支持后续的逻辑扩展。

private 修饰符如何限制直接访问
将成员变量设为 private 后,任何非本类内部的代码都无法直接读取或写入该变量。这从语言层面切断了外部对内部状态的随意篡改,是封装的第一道防线。

public class User {
private String name;
private int age;
public void setAge(int age) {
this.age = age;
}
public int getAge() {
return this.age;
}
}上述代码中,name 和 age 被标记为私有。如果尝试在类外执行 user.name = "test";,编译器会报错。只有通过 setAge() 等方法才能间接操作这些字段。
立即学习“Java免费学习笔记(深入)”;
Getter/Setter 中的逻辑控制与验证
在公开的方法中加入业务逻辑,可以在赋值时进行校验,或在取值时返回数据的副本,从而进一步保护内部状态不被破坏或泄露。

public class Account {
private double balance;
public void deposit(double amount) {
if (amount > 0) {
this.balance += amount;
}
}
public double getBalance() {
return this.balance;
}
}在 Account 类中,deposit 方法检查金额是否大于零,防止负数存入。这种逻辑控制确保了 balance 始终处于合法状态。同时,getBalance 返回的是基本类型 double 的值而非引用,避免了外部修改内部数值的风险。
不可变对象(Immutable)的彻底保护
对于不需要修改的状态,可以通过不提供 Setter 方法并将字段设为 final 来实现不可变性。这是最严格的封装形式,确保对象一旦创建,其内部状态就永远不会改变。
在上面的 User 示例中,如果去掉 setName 方法并将 name 设为 final,那么 name 只能在构造函数中初始化一次,之后任何尝试修改它的行为都会导致编译错误。这种方式消除了并发修改风险,使对象天然线程安全。


















