结合 OO 设计理念,谈谈 public、private、protected、default 的作用¶
一、四种访问权限¶
| 修饰符 | 本类 | 同包 | 子类 | 任意 |
|---|---|---|---|---|
| private | ✅ | ❌ | ❌ | ❌ |
| default(无修饰) | ✅ | ✅ | ❌ | ❌ |
| protected | ✅ | ✅ | ✅ | ❌ |
| public | ✅ | ✅ | ✅ | ✅ |
二、各自用途¶
private¶
- 实现细节,不想让外部碰。
- 字段基本都 private,通过 getter/setter 访问。
- 封装的核心。
default(包访问)¶
- 同包类可访问。
- 常用于包内工具类、SPI 实现。
- 接口方法默认 public,枚举构造默认 private。
protected¶
- 子类能访问(即使不同包)。
- 同包类也能访问。
- 设计上:给子类扩展用,但对外不公开。
public¶
- 对外 API。
- 一旦公开不能随便改。
三、OO 设计原则¶
1. 封装(Encapsulation)¶
隐藏内部实现,只暴露必要接口。字段 private,方法 public。
2. 最小知识原则(迪米特法则)¶
一个类应该对其他类了解最少。能 private 就不要 protected,能 protected 就不要 public。
3. 里氏替换¶
子类必须能替换父类。如果父类方法 public,子类重写要遵守契约。
四、为什么字段用 private¶
- 可以随时改内部实现(改字段名、类型)。
- 可以加校验(setter 里判空)。
- 可以控制只读/只写。
- 便于反射和代理。
public class User {
private String name;
public String getName() { return name; }
public void setName(String name) {
if (name == null || name.isEmpty())
throw new IllegalArgumentException();
this.name = name;
}
}
五、包级私有的妙用¶
- 同一包内多个类协作,用 default。
- 不同包不能访问,强制通过 public API。
Effective Java 建议
- 公有类的成员尽量用 private。
- 只有当子类需要访问时才用 protected。
- 最小化可访问性。