java方法重写是子类在继承关系下对父类非private、非final、非static方法的重新实现,要求方法名、参数列表完全一致,返回类型协变,访问权限不更严格,并推荐使用@override注解进行编译期校验。

Java 中方法重写(Override)是指子类提供父类中已声明方法的特定实现,前提是子类与父类存在继承关系,且满足一系列语法规则和访问约束。
重写的前提条件
必须同时满足以下几点,才能构成合法的方法重写:
- 子类与父类之间存在 继承关系(通过
extends关键字) - 子类中的方法与父类中的方法具有 相同的方法签名:方法名、参数列表(类型、个数、顺序)完全一致
- 子类方法的返回类型是父类方法返回类型的 协变类型(即相同,或是其子类;基本类型必须严格一致)
- 子类方法的访问权限 不能比父类更严格(例如父类是
protected,子类不能是private) - 父类方法不能是
final、static或private(这些方法无法被重写)
@Override 注解的作用
在子类方法上添加 @Override 注解不是强制要求,但强烈推荐。它有两大作用:
- 编译期检查:如果方法不满足重写条件(比如拼错方法名、参数不对),编译器会立即报错
- 提升可读性:明确告诉阅读代码的人:“此处有意替换父类行为”,而非误写或重载
示例:
class Animal {void speak() { System.out.println("Animal makes a sound"); }
}
class Dog extends Animal {
@Override
void speak() { System.out.println("Dog barks"); } // ✅ 正确重写
}
重写 vs 重载 vs 隐藏的区别
容易混淆的概念,关键看发生位置和判断依据:
- 重写(Override):发生在父子类之间,看运行时实际类型(多态基础)
- 重载(Overload):发生在同一个类中,方法名相同但参数列表不同,由编译时静态类型决定调用哪个
- 隐藏(Hide):子类定义了与父类同名 static 方法,此时不构成重写,而是子类方法“隐藏”了父类方法,调用取决于引用变量的声明类型
常见陷阱与注意事项
实际编码中要注意几个典型问题:
- 父类方法抛出异常,子类重写时只能抛出相同异常、其子类异常,或不抛异常;不能抛出更宽泛的异常类型
- 构造方法不能被重写(因为没有继承构造方法,子类需显式调用
super(...)) - 接口默认方法(
default)可以被类重写,但static接口方法不能 - 若父类方法是
public,子类重写也应为public;降级为protected会导致编译错误
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











