Java封装通过private隐藏字段并提供public getter/setter方法实现,可在方法中加入校验、日志等逻辑,确保数据安全与行为可控。

Java 中通过封装隐藏类的内部实现细节,核心是用 访问修饰符控制成员可见性,并提供受控的公共接口(方法)来操作数据,而不是直接暴露字段。
用 private 修饰成员变量
把字段声明为 private,外部类就无法直接读写。这是封装的第一步。
例如:
public class BankAccount {
private double balance; // 外部无法直接访问
private String accountNumber;
}
提供 public 的 getter 和 setter 方法
用公共方法间接访问或修改私有字段,可在方法中加入逻辑(如校验、日志、计算),把“怎么存/取”藏起来。
立即学习“Java免费学习笔记(深入)”;
例如:
public double getBalance() {
return balance; // 可以加日志或格式化
}
public void deposit(double amount) {
if (amount > 0) {
balance += amount; // 内部逻辑对外透明
}
}
public void withdraw(double amount) {
if (amount > 0 && amount <= balance) {
balance -= amount;
} else {
throw new IllegalArgumentException("无效取款金额");
}
}
不暴露可变对象的引用
如果私有字段是数组、集合或自定义可变对象,getter 不要直接返回原引用,否则外部可绕过封装修改内部状态。
正确做法:
- 返回不可变副本(如
Collections.unmodifiableList()) - 对数组用
Arrays.copyOf()返回新数组 - 对自定义对象,返回深拷贝或只读包装
例如:
private List<String> tags = new ArrayList<>();
public List<String> getTags() {
return Collections.unmodifiableList(tags); // 防止外部修改
}
把内部辅助方法设为 private
只被本类调用的工具方法(如验证、格式化、计算逻辑),一律用 private 修饰。它们属于实现细节,不应出现在类的公开契约中。
例如:
private boolean isValidAccountNumber(String num) {
return num != null && num.matches("\d{12}");
}
public void setAccountNumber(String num) {
if (isValidAccountNumber(num)) { // 复用内部逻辑
this.accountNumber = num;
}
}


















