跳转至

结合 OO 设计理念,谈谈 public、private、protected、default 的作用

一、四种访问权限

修饰符 本类 同包 子类 任意
private
default(无修饰)
protected
public

二、各自用途

private

  • 实现细节,不想让外部碰。
  • 字段基本都 private,通过 getter/setter 访问。
  • 封装的核心。
public class User {
    private String password;   // 外部不能直接读
}

default(包访问)

  • 同包类可访问。
  • 常用于包内工具类、SPI 实现。
  • 接口方法默认 public,枚举构造默认 private。

protected

  • 子类能访问(即使不同包)。
  • 同包类也能访问。
  • 设计上:给子类扩展用,但对外不公开。

public

  • 对外 API。
  • 一旦公开不能随便改。

三、OO 设计原则

1. 封装(Encapsulation)

隐藏内部实现,只暴露必要接口。字段 private,方法 public。

2. 最小知识原则(迪米特法则)

一个类应该对其他类了解最少。能 private 就不要 protected,能 protected 就不要 public。

3. 里氏替换

子类必须能替换父类。如果父类方法 public,子类重写要遵守契约。

四、为什么字段用 private

  1. 可以随时改内部实现(改字段名、类型)。
  2. 可以加校验(setter 里判空)。
  3. 可以控制只读/只写。
  4. 便于反射和代理。
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。
  • 最小化可访问性。