重载是同一类中参数不同的同名方法,提升调用灵活性;重写是子类覆盖父类同签名方法,实现运行时多态。重载在编译期绑定,重写在运行期绑定,参数列表是核心判定依据。

面试时区分重载与重写,关键不是复述定义,而是说清“谁在哪儿改了什么、为什么这么设计”。一句话点透:重载是同一个类里加多个同名但参数不同的方法,让调用更灵活;重写是子类按契约替换父类方法,让多态真正落地。
看发生位置和类关系
重载只发生在同一个类内部(或父子类各自独立定义,互不影响);重写必须出现在有继承关系的父子类之间,且子类明确覆盖父类已声明的方法。
- 重载示例:Calculator 类里同时有 add(int, int) 和 add(double, double)
- 重写示例:Dog 类中用 @Override void bark() 覆盖 Animal 类的同签名方法
- 注意:父类 private 方法不能被重写,子类同名方法只是新方法;static、final、构造方法也不能被重写
盯紧参数列表这个分水岭
这是面试最常考、也最容易答错的点——参数列表决定一切。
你接手一个需求时,是不是经常这样:"改一个小字段 → 结果把不相关的代码也改了"、"需求说得很模糊 → 做着做着发现跑偏了"、"数据库加个字段 → 上线才发现漏了数据兼容"、"做了个新功能 → 一个月后自己都忘了当时怎么设计的"、"写到一半被中断 → 再回来不知道从哪继续";这个 Skill 就是专门解决这些问题的。 它会自动探测你的项目环境(JDK、Spring Boot、ORM、数据库、前端框架),记在
- 重载要求参数个数、类型或顺序至少一项不同(如 test(int, String) 和 test(String, int) 算重载)
- 重写要求参数类型、个数、顺序完全一致;哪怕只把 String 换成 Object,JVM 就当它是新方法,不是重写
- 返回值、异常、访问修饰符不同,对重载无效(不构成重载),对重写却有严格约束(如子类权限不能比父类窄、异常不能更宽)
分清绑定时机和多态类型
重载是编译期决定的,重写是运行期决定的——这直接对应两种多态。
- 重载属于静态多态:编译器看引用变量的声明类型和实参类型,当场确定调哪个版本。例如 calc.add(1, 2) 和 calc.add(1.0, 2.0) 在编译阶段就绑定了
- 重写属于动态多态:运行时才根据对象实际类型选方法。例如 Animal a = new Dog(); a.makeSound(); 编译看 Animal,运行调 Dog 的实现
- 面试可以补充一句:没有重写,就没有真正的运行时多态
记住哪些“不同”根本不算数
很多候选人栽在细节上,因为混淆了判定依据。
- 以下四项不同,一律不参与重载判定,写了就编译报错:仅返回值不同、仅访问修饰符不同、仅异常声明不同、仅 static 与否不同
- 重写也不看这些项是否相同,但有反向约束:子类权限不能更严、返回值不能更宽(JDK5+允许协变)、检查异常不能更广
- 参数名不同、注释不同、方法体不同,统统不影响重载或重写判断
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










