子类重写父类方法时访问权限不能更严格,必须“只增不减”;private方法不可重写,static和final方法也不参与重写;务必使用@override注解以确保编译期校验重写正确性。

子类重写父类方法时,访问权限不能比父类更严格,只能保持不变或扩大——这是编译器强制执行的规则,不是建议。
重写方法的权限必须“只增不减”
Java按可见性从高到低排序为:public > protected > default(包私有) > private。重写时需严格遵循以下对应关系:
- 父类是 public → 子类重写方法必须是 public(不能用
protected、default或private) - 父类是 protected → 子类可用 protected 或 public(不能降为
default或private) - 父类是 default(无修饰符)→ 子类重写仅限同包内,且只能是 default 或 public
- 父类是 private → 不可继承,也就无法重写;子类中同名方法只是独立声明,与父类无关
为什么不能降低访问权限?
核心是为了保障多态调用安全。例如:
- 父类有
public void doWork(),外部代码通过父类引用调用它 - 若子类擅自改为
protected,运行时仍走多态逻辑,但实际调用会因权限不足而失败 - Java 把问题拦在编译期,直接报错:
Cannot reduce the visibility
哪些方法根本不能重写?
两类方法不具备运行时多态能力,因此不参与重写:
- static 方法:属于类本身,子类中同名方法是“隐藏”(hiding),调用取决于引用类型而非对象实际类型
- final 方法:明确禁止覆盖,子类声明同签名方法会导致编译失败
- 二者都不该加
@Override注解,否则编译不通过
务必使用 @Override 注解
这不是可选装饰,而是编译期校验契约:
- 强制检查方法签名是否真能匹配父类或接口中一个可继承的方法
- 捕获拼写错误(如
toString写成ToString)、参数类型不一致、返回值不协变等问题 - 防止“假重写”:父类方法被删或改名后,未加注解的子类方法会变成普通方法,导致逻辑静默失效
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











