@Override注解本身不改变方法行为,仅提示编译器检查重写正确性;真正实现逻辑覆盖的是Java方法重写机制,需满足方法签名、返回类型、访问修饰符及非final/static/private等条件。

@Override 注解本身不会改变方法行为,它的作用是告诉编译器:这个方法意在重写父类中已有的方法。真正实现“覆盖原逻辑”的,是 Java 的方法重写(Overriding)机制;@Override 只是帮你提前发现写错(比如方法名拼错、参数不匹配、访问权限不对等),避免你以为重写了,其实只是新增了一个同名方法。
必须满足的重写条件
只有同时满足以下几点,子类方法才算真正重写父类方法:
- 方法名、参数列表(类型、个数、顺序)必须和父类完全一致
- 返回类型必须相同,或是父类返回类型的子类型(协变返回类型,如父类返回 Object,子类可返回 String)
- 访问修饰符不能比父类更严格(例如父类是 protected,子类不能是 private;但可以是 protected 或 public)
- 不能重写被 final、static 或 private 修饰的父类方法(它们不可被重写)
正确使用 @Override 的写法示例
假设父类有:
class Animal {
public void makeSound() {
System.out.println("Some sound");
}
}
子类重写并加注解:
class Dog extends Animal {
@Override // ✅ 正确:签名匹配,且父类方法可被重写
public void makeSound() {
System.out.println("Woof woof!");
}
}
如果写错了,比如少一个参数:
class Dog extends Animal {
@Override
public void makeSound(String volume) { // ❌ 编译报错:找不到可重写的父类方法
System.out.println("Woof! " + volume);
}
}
此时编译器会立刻提示错误,帮你快速定位问题。
常见误区提醒
- @Override 不是必需的,不加也能重写成功,但强烈建议加上——它是代码自文档的重要部分,也是安全网
- 重写的是实例方法,不是字段。子类定义同名字段只是“隐藏”(hiding),和重写无关
- 构造方法不能被重写(也没有意义),所以不能在构造方法上加 @Override
- 接口中的默认方法(default method)也可以被实现类用 @Override 重写
运行时看效果:多态体现覆盖逻辑
真正验证是否覆盖成功,要看运行时行为:
Animal a = new Dog(); a.makeSound(); // 输出 "Woof woof!",不是 "Some sound"
因为 JVM 在运行时根据实际对象类型(Dog)调用其重写后的方法,这就是动态绑定——覆盖生效的关键。

















