重载是同一个类中方法名相同但参数列表不同的多态机制,重写是子类在继承关系中对父类方法签名完全一致的重新实现;前者编译期绑定,后者运行期动态分派。

直接看本质区别最有效:重载是“同一个类里多个同名但参数不同的方法”,重写是“子类改写父类已有方法,签名必须一致”。关键不在名字像不像,而在发生时机、作用范围和编译器怎么处理。
发生位置和前提条件不同
重载只发生在同一个类内部,不需要继承关系。只要方法名相同、参数列表(个数/类型/顺序)不同,就构成重载。
重写必须有父子类继承关系,且子类中定义的方法要与父类被继承的方法完全同名、同参数列表,否则就是新方法,不是重写。
- 重载示例:
print(String)、print(int)、print(String, int)都在同一个类里 - 重写示例:父类
Animal.eat(),子类Dog.eat()必须参数为空,不能改成eat(String food)
绑定时机和调用逻辑不同
重载由编译器在编译期决定,根据你写的实参类型和个数,静态匹配到具体方法。比如 calc(3) 调用 calc(int),calc("3") 调用 calc(String)。
重写由JVM在运行期决定,看的是对象实际类型。即使变量声明为父类类型,只要运行时指向子类实例,就执行子类重写后的方法:
你接手一个需求时,是不是经常这样:"改一个小字段 → 结果把不相关的代码也改了"、"需求说得很模糊 → 做着做着发现跑偏了"、"数据库加个字段 → 上线才发现漏了数据兼容"、"做了个新功能 → 一个月后自己都忘了当时怎么设计的"、"写到一半被中断 → 再回来不知道从哪继续";这个 Skill 就是专门解决这些问题的。 它会自动探测你的项目环境(JDK、Spring Boot、ORM、数据库、前端框架),记在
-
Animal a = new Dog(); a.eat();→ 执行的是Dog.eat() - 这个过程叫动态分派,是多态的核心机制
哪些东西能变、哪些绝对不能变
重载对返回值、修饰符、异常声明完全不敏感——它们变了也不影响重载成立,但仅靠它们不同,无法构成重载。
重写则有严格约束,口诀是“两同两小一大”:
- 两同:方法名相同、参数列表相同
-
两小:返回值类型 ≤ 父类(支持协变,如父类返回
Number,子类可返回Integer);抛出的检查异常 ≤ 父类(不能扩大异常范围) -
一大:访问权限 ≥ 父类(如父类是
protected,子类只能是protected或public)
特别注意:static、private、final 方法不能被重写;构造方法也不能被重写。
怎么一眼识别你在用哪个
写代码时问自己三个问题:
- 这两个方法在同一个类里吗?→ 是 → 往重载想;否 → 往重写想
- 它们参数列表一样吗?→ 一样 → 不可能是重载;不一样 → 不可能是重写
- 有没有
extends或implements关系?→ 没有 → 排除重写;有 → 再核对签名是否完全一致
顺手加上 @Override 注解——它不会让重写生效,但一旦写错(比如父类没这方法、参数不对),编译器立刻报错,是防坑利器。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










