Java通过访问修饰符实现封装:用private隐藏核心数据与方法,public提供带校验的接口,protected和包级权限控制继承与模块内访问,并结合final、不可变对象及防御性拷贝加固封装。

Java 中通过访问权限控制(access modifiers)来隐藏系统实现细节,是实现封装(Encapsulation)的核心手段。本质是限制外部对类内部成员(字段、方法、构造器等)的直接访问,只暴露必要的接口,把“怎么做”藏起来,只告诉外界“能做什么”。
用 private 封装核心数据和内部逻辑
将类的属性和不希望被外部直接调用的方法声明为 private,这是最基础也最关键的一步。外部代码无法读写 private 字段,也无法调用 private 方法,从而切断了对实现细节的依赖。
例如:
class BankAccount {private double balance = 0.0;
private String accountNumber;
private void logTransaction(String action) {
// 内部记账日志逻辑,不对外暴露
System.out.println("Logged: " + action);
}
public void deposit(double amount) {
if (amount > 0) {
balance += amount;
logTransaction("Deposit " + amount); // 内部调用,安全可控
}
}
}
这里 balance 和 logTransaction 都被隐藏,用户只能通过 deposit 等 public 方法操作账户,无法绕过校验或误改余额。
立即学习“Java免费学习笔记(深入)”;
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
用 public 提供受控的访问入口
对外只提供 public 的方法(如 getter/setter 或业务方法),并在其中加入逻辑控制,比如参数校验、状态检查、副作用管理。这些方法就是类的“契约接口”,定义了安全、一致的交互方式。
- 避免直接暴露 private 字段:不要写 public double balance;
- setter 中做校验:如 setAge(int age) 检查 age ≥ 0
- getter 可返回不可变副本:如返回 new ArrayList(internalList),防止外部修改内部集合
合理使用 protected 和包级权限(默认)
protected 允许子类继承并复用实现,但不向无关类公开,适合设计可扩展的框架类;包级权限(不写修饰符) 表示同包内可见,常用于模块内部协作——比如把数据模型、DAO、Service 的辅助类放在同一包中,彼此可访问,但对外仍保持封闭。
例如,一个支付模块中:
- PaymentProcessor(public)对外提供 pay() 接口
- SignatureGenerator(package-private)只供本包内调用,算法细节不暴露
- AbstractRefundPolicy(protected)供子类定制退款规则,但不开放给业务层随意使用
配合 final、不可变对象进一步加固封装
访问权限只是第一步。真正稳固的隐藏还需配合:
- 将类声明为 final,防止被意外继承破坏封装
- 用不可变对象(如 LocalDate、String)作为字段类型,避免外部拿到引用后修改内部状态
- 构造器中对传入的可变参数做防御性拷贝:this.items = new ArrayList(items)
这样即使某个方法返回了内部集合,也不会危及封装完整性。

















