重载是同一类中方法名相同但参数列表不同,属编译期静态多态;重写是子类继承父类后方法名、参数列表完全一致,属运行期动态多态,用于定制行为。

方法重载和重写在 Java 中都用同一个方法名,但目的、规则和使用场景完全不同。掌握它们的区别,才能写出清晰、可扩展、不易出错的代码。
重载:同一类里“一词多义”
重载发生在同一个类中,靠参数列表不同来区分——个数、类型或顺序任一不同即可。编译器在编译时就决定调用哪个版本,属于静态绑定。
- 方法名必须相同,但参数列表不能一样
- 返回类型、访问修饰符、异常声明不影响重载判定
- 仅靠返回值不同或仅修饰符不同,不构成重载,会编译报错
- 常见于构造器、工具类(如 Arrays.sort()、PrintStream.println())
重写:子类对父类行为的“定制化替换”
重写必须发生在继承关系中,子类提供与父类完全一致的方法签名(名称 + 参数),运行时根据对象实际类型调用对应实现,属于动态绑定。
- 方法名、参数列表、返回类型(Java 5+ 支持协变返回,即子类可返回更具体的子类型)必须一致
- 子类访问权限不能比父类更严格(如父类是 protected,子类不能是 private)
- 不能重写 private、static、final 方法
- 强烈建议加上 @Override 注解,避免拼写错误或签名不匹配导致意外隐藏而非重写
典型应用对比
重载解决的是“怎么调用更方便”,重写解决的是“子类怎么表现得不一样”。比如:
- 重载场景:一个 User 类提供多个构造方法——只传姓名、传姓名和年龄、传全部字段;Calculator 类支持 int、double、String 等不同参数类型的 add()
- 重写场景:父类 Animal 定义 makeSound(),子类 Dog 和 Cat 各自重写,发出不同声音;框架中常重写 toString()、equals()、hashCode() 来适配业务逻辑
容易踩坑的地方
新手常混淆两者的判断依据。记住关键点:
- 看是否涉及继承——有继承且签名一致,优先考虑重写;无继承或参数变了,就是重载
- 编译时报错“method xxx is already defined”通常是重载写错了(比如只改了返回值)
- 运行时没走预期逻辑,可能是重写失败(比如漏了 @Override,或父类方法是 private)
- 静态方法可以被“隐藏”(同名同参,但不是重写),这点和实例方法重写有本质区别
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











