重载发生在同一类中,参数列表不同,编译期绑定;重写发生在子类中,参数列表相同,运行期动态绑定,依赖继承且服务于多态。

面试时一说“重载和重写”,很多人张嘴就答“都是方法名一样”,结果被追问一句“那区别到底在哪”,立马卡壳。混淆的根本原因,不是记不住定义,而是没抓住它们各自存在的目的和发生场景。下面从三个最易踩坑的维度帮你理清边界。
看“谁在哪儿改了什么”——发生位置决定本质
重载只发生在同一个类内部(或父子类中各自独立定义,互不影响),比如 Calculator 类里同时有 add(int, int) 和 add(double, double);它不依赖继承,也不需要父类存在。重写则必须有继承关系,子类针对父类已声明的非 private、非 static 方法,用完全相同的方法签名重新提供实现。如果父类方法是 private,子类里写个同名方法,那只是新方法,不是重写。
盯死参数列表——唯一不可妥协的判断标尺
这是面试官最爱挖坑的地方:
- 重载:参数个数、类型、顺序三者中至少一项不同就算。比如 test(int, String) 和 test(String, int) 是合法重载。
- 重写:参数列表必须一字不差。哪怕把 String 换成 Object,JVM 就当它是新方法,不会触发动态绑定,多态也就失效了。
- 返回值、异常、访问修饰符这些,对重载完全无关;对重写却有严格约束(如子类权限不能比父类更窄,异常不能抛得更宽)。
想清楚“什么时候决定调哪个”——绑定时机暴露设计意图
重载在编译期就定死了,编译器只看引用变量的声明类型。比如 Animal a = new Dog(); a.speak(); —— 如果 speak() 在 Animal 里有多个重载版本,编译器按 Animal 类里的声明选,跟实际是 Dog 还是 Cat 无关。重写则是运行期才决定,JVM 看对象的实际类型,这才叫真正的多态。你写 a.speak(),最终执行的是 Dog 类里重写的 speak(),不是 Animal 的。
只要记住:重载是“同一类里加多个入口”,为调用方便;重写是“子类按约定替换实现”,为多态服务。位置、参数、时机,三者对上号,就不会混。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











