Java继承中访问修饰符合规性取决于三点:子类能否访问、能否重写、重写后权限是否合法;private不参与继承,default限同包,protected支持跨包子类访问但不可外部调用,public可继承重写但不可收紧权限。

Java 中访问修饰符在继承关系中是否合规,关键看三点:子类能否访问父类成员、能否重写、重写后权限是否合法。规则由编译器强制检查,不满足直接报错,不是运行时问题。
private 成员:不参与继承,子类完全不可见
父类声明为 private 的字段或方法,对子类而言就像不存在。子类既不能直接调用,也不能重写——哪怕写一个同名同参的方法,也只是新增一个独立方法,和父类无关。
- 原因在于 private 是“本类专属”,作用域严格限制在声明它的类内部
- 若子类需要读写该数据,父类应提供 public 或 protected 的 getter/setter 方法
- 强行通过反射访问属于破坏封装,仅限调试或特殊框架场景,生产代码中应避免
default(包私有)成员:同包子类可用,跨包即失效
没写任何修饰符的成员,默认只对同一包内的类开放。子类如果和父类不在同一个包,就无法访问这些成员,更谈不上重写。
你接手一个需求时,是不是经常这样:"改一个小字段 → 结果把不相关的代码也改了"、"需求说得很模糊 → 做着做着发现跑偏了"、"数据库加个字段 → 上线才发现漏了数据兼容"、"做了个新功能 → 一个月后自己都忘了当时怎么设计的"、"写到一半被中断 → 再回来不知道从哪继续";这个 Skill 就是专门解决这些问题的。 它会自动探测你的项目环境(JDK、Spring Boot、ORM、数据库、前端框架),记在
- 适合模块内部协作,比如工具包里一组辅助方法,只供同包下的子类复用
- 跨包继承时,这类成员自动“消失”,子类编译会提示找不到符号
- 想让跨包子类也能用,应改为 protected
protected 成员:专为继承设计,子类友好但有限制
protected 允许同一包内所有类访问,也允许不同包的子类在自身方法中使用(比如在子类的 doWork() 里调用 super.doInternal()),但它不等于 public。
立即学习“Java免费学习笔记(深入)”;
- 子类对象不能直接通过点号调用父类 protected 成员(如
childObj.protectedMethod()不合法) - 重写 protected 方法时,访问权限可以升级为 public,但不能降级为 default 或 private
- 这是继承中最常用的修饰符,平衡了可扩展性与封装性
public 成员:完全开放,但重写不能收紧权限
父类的 public 成员对所有人可见,子类自然可以继承、调用、重写。
- 重写时必须保持或放宽访问权限:父类是 public,子类重写方法也必须是 public
- static 和 final 方法不能被重写,加 @Override 会编译失败,它们只是被继承并可直接调用
- 构造器不参与继承,子类需用 super() 显式调用父类构造器

















