Java方法重写是子类提供父类已有方法的新实现以实现多态,必须满足:方法名与参数列表完全一致、返回类型协变或相同、访问权限不更严格、不能重写final/static/private方法,并推荐使用@Override注解确保编译期校验。

在 Java 中,方法重写(Override)是指子类提供父类中已定义方法的**新实现**,从而改变该方法在子类对象上的行为。要正确重写,必须满足几个关键条件,否则编译器会报错或变成重载(Overload)。
重写的前提条件
只有满足以下全部要求,Java 才认为是合法的 Override:
- 方法名、参数列表(类型、个数、顺序)必须完全一致
- 返回类型必须相同,或是父类返回类型的子类型(协变返回类型,如父类返回
Object,子类可返回String) - 访问修饰符不能比父类更严格(例如父类是
protected,子类不能用private;但可以用public或protected) - 不能重写被
final、static或private修饰的方法(private方法对子类不可见,所以不是重写)
@Override 注解的作用
加上 @Override 注解不是强制的,但强烈推荐——它让编译器帮你检查是否真的重写了父类方法。如果写错了方法名或参数,编译时就会报错,避免“以为重写了,其实没生效”的低级错误。
例如:
立即学习“Java免费学习笔记(深入)”;
class Animal {
public void speak() {
System.out.println("Animal makes a sound");
}
}
class Dog extends Animal {
@Override // ✅ 明确告诉编译器:这是重写
public void speak() {
System.out.println("Dog barks: Woof!");
}
}
常见误区与注意事项
容易混淆或出错的地方:
-
重载 ≠ 重写:只改了参数列表(比如加了个
int参数),那就是重载,和父类方法共存,不会覆盖行为 - 构造方法不能被重写:构造方法名必须和类名一致,父子类名不同,天然不满足重写条件
-
静态方法可以“同名”,但不是重写:子类定义同名
static方法,只是隐藏(hiding)父类方法,调用取决于引用类型,而非实际对象类型 -
重写后,父类原逻辑完全不执行:除非显式用
super.methodName()调用,否则不会自动继承父类实现
如何在重写中复用父类逻辑
很多时候你不是要完全抛弃父类行为,而是“在它的基础上补充或调整”。这时用 super 关键字调用父类版本即可:
class Bird extends Animal {
@Override
public void speak() {
super.speak(); // 先执行父类逻辑:"Animal makes a sound"
System.out.println("Bird chirps: Tweet!"); // 再添加子类特有行为
}
}
这种模式在模板方法、日志增强、权限校验等场景中非常实用。


















