子类重写父类方法时访问权限不能更严格:父类public则子类必须public;protected则子类可用protected或public;默认则可选默认、protected、public;private不参与重写。

子类重写父类方法时,访问权限不能比父类更严格——这是编译器强制执行的规则,不是风格建议。只要父类方法能被某类代码调用,子类重写后也必须保证它还能被同样范围的代码调用。
看清楚父类方法的实际修饰符
别只看方法名和参数,要查父类源码或文档确认原始访问级别:
- 父类是 public → 子类重写方法必须写 public(删掉修饰符或改成
protected会直接编译失败) - 父类是 protected → 子类可用 protected 或 public,但不能是默认(包私有)或
private - 父类是默认(没写修饰符)→ 子类可选默认、protected 或 public,但不能是
private - 父类是 private → 不参与继承,子类中同名方法不算重写,只是独立定义
别依赖 IDE 自动生成就放松警惕
IDE 插入 @Override 方法时常默认加 public,但如果你手动删了,又没核对父类声明,就容易踩坑:
- 单元测试常与类同包运行,包内调用一切正常,掩盖问题
- 上线后 Spring、Tomcat 等容器通过反射跨包调用,会因方法不可见而抛
IllegalAccessError或静默跳过 - Servlet、Filter 等规范接口的方法隐式为
public,实现类中必须显式写出public
放宽权限是安全且常见的做法
权限放大不违反契约,反而增强可用性:
-
protected → public:适合抽象基类定义内部逻辑,具体实现类向外部暴露能力 - 包私有 →
protected或public:把原仅供包内使用的工具方法,开放给继承链下游或外部模块 -
public已是最高权限,保持即可,不能再“扩大”
字段不参与重写,别试图靠改字段权限来补救
成员变量不能被重写,只能被隐藏;其访问权限不参与多态,也不受重写规则约束:
- 子类定义同名字段,只是覆盖(hiding)父类字段,不是重写
- 通过父类引用访问字段,看到的永远是父类字段值
- 真正控制可见性的做法:把字段设为
protected或包私有,再提供getter/setter,并在子类中重写这些方法并放宽权限
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











