访问修饰符 (access modifiers) 控制类、方法和字段的 可见性 — 即谁可以访问它们。它们是封装背后的机制。Java 有四个等级,从最严格到最不严格。
四个等级
java
{
a;
b;
c;
d;
}
Modifier Same class Same package Subclass (other pkg) Everywhere
────────────────────────────────────────────────────────────────────────
public ✓ ✓ ✓ ✓
protected ✓ ✓ ✓ ✗
(default) ✓ ✓ ✗ ✗
private ✓ ✗ ✗ ✗
注意:省略修饰符会得到 package-private(默认)— 仅在同一包内可见。这是一个独立的等级,与 public 不同。
public class BankAccount {
private double balance; // hidden — protect the data
public void deposit(double amt) { // public API — controlled access
if (amt > 0) balance += amt;
}
public double getBalance() { // read-only access to private data
return balance;
}
}
// outside code CANNOT do account.balance = -1000 (it's private)
标准模式:将字段设为 private,并通过受控的 public 方法暴露。这保护了不变式,让你可以改变内部实现而无需破坏调用者 — 这是封装的本质。
✓ Fields → private (almost always); expose via methods if needed
✓ Public API methods → public
✓ Internal helpers → private
✓ For subclasses to access/override → protected
✓ Classes → public (usable anywhere) or package-private (internal to a module)
原则:使用 最严格 的修饰符(最小权限原则)— 从 private 开始,仅在必要时放宽。
访问修饰符是 Java 实现 封装 的方式 — 这是 OOP 的基础原则,即隐藏内部细节并暴露受控的接口。
选择正确的修饰符(字段默认为 private,仅公开 API 为 public)可以保护数据完整性,防止外部代码依赖内部实现(这样你可以自由重构),并明确类的预期使用方式。
理解所有四个等级 — 特别是经常被忽视的 package-private 默认值和跨越子类的 protected — 对设计良好的、可维护的类和 API 至关重要,也是控制系统中有多少代码被暴露的关键。