public、private、protected的核心区别在于访问权限的范围:public允许任何位置访问;private仅限同类内访问;protected允许同包类及所有子类(跨包也可)访问;default仅限同包访问。

Java 中 public、private、protected 的核心区别在于**谁可以访问它们**,而不是“能不能写”,关键看访问发生的**位置关系**:是否在同一个类、同一个包、是不是子类、是否跨包。
public:谁都能访问
只要能拿到对象或类名,任何地方的代码都可以直接使用。
- 同一类里当然能用
- 同包其他类可以直接调用或读写
- 不同包的子类可以继承并使用(比如重写 public 方法)
- 不同包的非子类也能直接访问(比如 new 一个 public 类,调它的 public 方法)
private:只有自己能用
严格限制在声明它的那个类内部。哪怕同包、哪怕子类、哪怕反射(不加权限绕过不算常规访问),都算“外部”,不能直接访问。
- 子类无法继承 private 成员,也不能通过 super 访问
- 同包其他类完全不可见,编译直接报错
- 通常配合 public getter/setter 提供受控访问
protected:同包 + 子类专属通道
比 private 宽松,比 public 严格。它把“可访问”拆成两组人:同包的所有类,以及所有子类(无论包是否相同)。
- 同包子类和非子类都能直接访问 protected 成员
- 不同包子类可以通过继承访问(如在子类方法里用 this.xxx 或 super.xxx)
- 不同包的非子类——哪怕 import 了也用不了,编译不通过
不复杂但容易忽略:default(不写修饰符)其实也常用,它只允许同包访问,既不开放给子类(除非同包),也不开放给外部包,是比 protected 更保守的“包内协作”选择。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











