重写是子类改写父类方法,发生在继承关系中,要求方法名、参数列表、返回类型(或协变)完全一致,运行时动态绑定;重载是同一类中多个同名但参数列表不同的方法,编译时静态绑定。

方法重写(Override)和方法重载(Overload)名字像,但本质不同:重写是子类改父类行为,发生在继承中;重载是同一类里提供多个同名但参数不同的方法,用来增强调用灵活性。
看发生位置和关系
重写一定出现在父子类之间,依赖继承。没有 extends 就谈不上重写。
重载只在同一个类内部发生,跟继承无关,哪怕没父类也能重载。
- 重写示例:Dog 继承 Animal,重写 makeSound(),运行时调用 Dog 的版本
- 重载示例:Calculator 类里有 add(int, int)、add(double, double)、add(int, int, int),编译时就决定用哪个
看方法签名是否相同
重写要求方法名、参数列表、返回类型(或协变子类型)完全一致,连参数顺序都不能变。
重载恰恰相反——方法名必须相同,但参数列表必须不同(个数、类型或顺序任一不同即可)。
- 仅返回类型不同?不是重写,也不是重载,编译报错
- 参数类型顺序调换,比如 (String, int) vs (int, String),属于重载,不是重写
- 子类方法返回 Object,父类返回 String?不合法重写(除非是 JDK 5+ 协变返回且 Object 是 String 父类——但实际不成立,所以错误)
看什么时候起作用
重载是编译时决定的,Java 编译器看实参类型和个数,直接绑定方法;重写是运行时决定的,JVM 看对象实际类型,实现动态多态。
- Animal a = new Dog(); a.makeSound(); → 调用 Dog 的重写版本(运行时多态)
- calc.add(3.14, 2.71); → 编译器立刻选中 double add(double, double)(编译时多态)
- 重载不能跨类调用“同名不同参”的父类方法来替代重写——那只是两个独立方法
看哪些修饰符和特性受限制
重写有严格约束:不能重写 private / static / final 方法;访问权限不能更严(public 可重写 protected,反之不行);异常只能缩小或不抛。
- private 方法子类根本看不见,自然无法重写
- static 方法属于类,不是实例,重写无效(子类定义同名 static 方法只是隐藏,非重写)
- 重载对修饰符、异常、返回类型几乎无限制:public/private 都可,抛 Exception 或不抛都行,返回 int 或 String 都可以
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











