重载是同一类中定义多个同名但参数不同的方法以提升调用便利性,重写是子类覆盖父类方法以实现多态;重载发生在编译期、依赖参数列表差异,重写发生在运行期、要求参数完全相同且受访问权限等契约约束。

面试时回答重载与重写,关键不是背定义,而是说清“谁在哪儿改了什么、为什么这么设计”。一句话概括:重载是同一类里加多个同名但参数不同的方法,让调用更方便;重写是子类按约定替换父类方法,让多态真正生效。
发生位置和关系不同
重载只发生在同一个类内部(或父子类中各自独立定义),不依赖继承;重写必须发生在有继承关系的父子类之间,子类对父类已声明的方法进行覆盖。
- 重载示例:
add(int, int)和add(double, double)同在Calculator类里 - 重写示例:
Dog类中@Override void bark()对应父类Animal的同签名方法
参数列表是核心分水岭
这是最常被问、也最容易答错的点——重载靠参数不同来区分,重写必须参数完全相同。
- 重载要求参数个数、类型或顺序至少一项不同;仅返回值、修饰符或异常不同,不算重载
- 重写一旦参数稍有差异(比如把
String改成Object),JVM 就当它是新方法,不是重写,也不会触发动态绑定
绑定时机与多态性质不同
重载是编译期决定的,看的是引用变量的声明类型;重写是运行期决定的,看的是对象的实际类型。
- 例如
Animal a = new Dog(); a.makeSound();—— 编译时只认Animal类型,但运行时调用的是Dog的实现,这才是多态 - 而
calc.add(1, 2)和calc.add(1.0, 2.0)在编译阶段就确定了调哪个版本,不涉及对象实际类型
规则约束方向相反
重载几乎无限制(除参数外,返回值、异常、访问修饰符都可任意);重写则处处是契约,子类必须遵守“不能比父类更窄”的原则:
-
访问权限:子类方法不能比父类更严格(
public→protected不合法) -
返回类型:JDK5+ 允许协变返回(如父类返回
Animal,子类可返回Dog) -
异常声明:子类不能抛出比父类更宽泛的检查异常(
IOException→Exception不合法)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











