public跨包子类完全可访问;protected可继承但不可通过父类实例访问;default跨包子类不可见;private彻底隔离,子类无法继承或访问。

Java 中这四个访问修饰符在“不同包子类”这一场景下的行为差异,是理解继承与封装的关键。核心在于:子类是否能访问父类成员,不仅取决于它是不是子类,还取决于它和父类是否在同一个包里。
public:跨包子类完全可访问
只要子类继承了父类,无论是否同包,都能直接使用 public 成员(字段、方法、构造器)。这是唯一对跨包子类无限制的修饰符。
- 子类中可以直接调用 public 方法,读写 public 字段
- 即使父类在
com.example.model,子类在org.test.service,也不影响访问 - 适用于设计为对外暴露的 API 元素,比如框架提供的公共接口方法
protected:跨包子类可继承,但访问受限
protected 是专为继承设计的修饰符。跨包子类可以继承 protected 成员,但不能通过父类实例直接访问——只能操作“自己”或“向上转型后指向自身的对象”。
- 子类中可直接调用 继承来的 protected 方法,或访问 自己的 protected 字段
- 但不能写
parentObj.protectedMethod()(parentObj 是父类类型引用且不在同包) - 常见于模板方法模式中,父类定义流程骨架,子类重写 protected 钩子方法
default(包级私有):跨包子类完全不可见
default 没有显式关键字,作用域严格限定在声明它的包内。跨包子类既不能继承,也不能访问这些成员。
- 编译器会报错:
error: xxx has private access in YYY(实际提示是 “not visible”) - 即使子类正确 extends 父类,也无法看到 default 字段或调用 default 方法
- 适合内部协作组件,比如同一包下的工具类与策略实现类之间共享逻辑
private:跨包子类彻底隔离
private 成员只属于声明它的那个类本身。子类——无论同包还是跨包——都无法继承、无法访问、无法覆盖。
- 子类中写
super.privateField或this.privateMethod()均编译失败 - 同一父类的不同实例之间倒是可以互相访问 private 成员(如复制构造器中),但这和子类无关
- 用于封装核心状态,比如
BankAccount.balance,强制走受控的 public/protected 方法
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











