Java方法重写是子类重新定义父类非final、非static、非private方法,要求方法名、参数列表相同,返回类型相同或协变,访问权限不更严格,以实现运行时多态。

Java 方法重写(Override)是指子类重新定义父类中已有的方法,要求方法名、参数列表、返回类型完全一致(协变返回类型除外),且访问权限不能更严格。核心目的是实现多态,让子类提供更具体的实现。
重写的前提条件
必须满足以下几点才能构成有效重写:
- 发生在继承关系中(子类 extends 父类)
- 方法名、参数列表(类型、个数、顺序)必须完全相同
- 返回类型相同,或为父类返回类型的子类型(协变返回)
- 子类方法的访问修饰符不能比父类更严格(如父类是 protected,子类不能用 private)
- 父类方法不能是 final、static 或 private(这些无法被重写)
@Override 注解的作用
加上 @Override 注解不是强制的,但强烈推荐。它有两个关键作用:
- 告诉编译器:我打算重写父类方法 —— 编译器会检查是否真有可重写的方法,避免拼写错误或参数写错导致“意外重载”
- 提升代码可读性,明确表达设计意图
例如:
class Animal { void speak() { System.out.println("Animal sound"); } }
class Dog extends Animal {
@Override
void speak() { System.out.println("Woof!"); }
}
和重载(Overload)的区别
容易混淆,但本质不同:
立即学习“Java免费学习笔记(深入)”;
- 重写(Override):发生在父子类之间,方法签名相同,是运行时多态
- 重载(Overload):发生在同一个类中,方法名相同但参数列表不同,是编译时多态
注意:仅返回类型不同不算重载,也不构成重写,编译会报错。
常见陷阱与注意事项
- 子类重写方法抛出的异常不能比父类更宽泛(只能抛出相同异常、其子类,或不抛异常)
- 构造方法不能被重写(因为没有继承构造方法)
- 静态方法可以“同名同参”,但这属于隐藏(Hide),不是重写;调用取决于引用类型,而非实际对象类型
- 如果父类方法是 default(接口默认方法),子类实现类可以重写它;但接口之间继承时,子接口不能“重写”父接口的 default 方法(只能继承或在实现类中覆盖)


















