Java中只有@Override注解用于标识方法重写,重载无需且不能使用注解;重写需继承关系且方法签名一致,重载则在同一类中通过参数列表不同实现。

Java里没有 @Overload 这个注解,这是个常见误解。只有 @Override 是Java内置的合法注解,用于明确标识方法重写;而“重载”根本不需要、也不能加任何注解——它由编译器自动识别,只看参数列表是否不同。
重写(Override)必须用 @Override 注解
这个注解不是强制语法,但强烈推荐使用。它的作用是让编译器帮你检查:当前方法是否真的在重写父类(或接口)中已有的方法。如果方法名、参数、返回类型稍有偏差(比如拼错名字、少一个参数),编译器立刻报错,避免隐性bug。
- 必须出现在子类中,且有继承关系(或实现接口)
- 方法签名(方法名 + 参数列表)必须和父类/接口中完全一致
- 返回类型可以是父类返回类型的子类(协变返回,Java 5起支持)
- 不能重写 private、static、final 方法——加了 @Override 会直接编译失败
重载(Overload)不写任何注解,靠参数列表区分
重载发生在同一个类里(或子类中对继承来的方法再次重载),完全不依赖注解。只要方法名相同,参数列表不同(类型、个数、顺序三者至少一项不同),就构成重载。编译器在编译阶段就根据你传入的实际参数,决定调用哪个版本。
- 返回类型、访问修饰符、异常声明,都不影响重载判断
- 仅靠返回类型不同,而参数完全一样 → 编译错误,不是重载
- public void show(int x) 和 private void show(int x) → 不构成重载,编译报错
- void print(String s) 和 void print(Object o) → 是重载(参数类型不同)
关键区别一目了然
最直接的区分方式就是看“有没有继承关系”和“参数有没有变”:
立即学习“Java免费学习笔记(深入)”;
- 有 extends 或 implements,方法签名没变 → 是重写,建议加 @Override
- 没继承关系,或在同一类里,参数列表变了 → 是重载,不用加注解
- 加了 @Override 却报错 → 很可能写错了,不是重写(比如参数类型写成 String 而父类是 Object)
- 两个同名方法参数一样但返回类型不同 → 编译通不过,既不是重写也不是重载
实际编码中怎么快速判断
写完一个同名方法,先问自己两个问题:
- 这个方法是不是想替换父类的行为?→ 是,就检查是否满足重写条件,加上 @Override
- 这个方法是不是想让同一个操作支持更多输入形式?→ 是,就改参数(别只改返回值),不加注解
- IDE(如IntelliJ或Eclipse)通常会提示:该加 @Override 却没加,或不该加却加了 → 信它


















