子类重写父类方法时访问权限不能更严格,必须等于或高于父类;private方法不可重写;static和final方法不参与重写;务必使用@Override注解确保重写正确性。

子类重写父类方法时,访问权限不能比父类更严格,这是Java为保障多态安全而强制执行的规则。它不是可选项,而是编译器会直接拦截的硬性约束。
访问权限只能扩大或保持不变
父类方法的可见性决定了子类重写时的最低门槛:
- 父类是 public → 子类重写必须是 public(不能用 protected、default 或 private)
- 父类是 protected → 子类可用 protected 或 public(不能降为 default 或 private)
- 父类是 default(包私有)→ 子类重写仅限同包内,且只能是 default 或 public
- 父类是 private → 不可继承,也就谈不上重写;子类中同名方法只是独立声明,与父类无关
为什么不能降低可见性?
核心是为了避免多态调用失效。比如:
- 父类有个 public 方法
doWork(),外部代码通过父类引用调用它 - 若子类擅自改成 protected,运行时仍走多态逻辑,但实际调用会因权限不足而失败
- 编译器提前报错
Cannot reduce the visibility,把问题拦在编译期
static 和 final 方法不参与重写
它们不具备运行时多态能力:
立即学习“Java免费学习笔记(深入)”;
- static 方法 属于类,子类中同名 static 方法是“隐藏”(hiding),调用取决于引用类型,而非对象实际类型
- final 方法 明确禁止覆盖,子类若声明同签名方法,编译直接报错
- 两者都不该加
@Override,否则编译不通过
务必使用 @Override 注解
这不是装饰,而是编译期契约:
- 强制校验:方法签名是否真能匹配父类或接口中一个可继承的方法
- 捕获常见错误:拼写错误(如
toString写成ToString)、参数类型不一致、返回值不协变 - 防止“假重写”:父类方法被删或改名后,未加注解的子类方法会变成普通方法,导致逻辑静默失效


















