重载是编译时静态多态,同一类中方法名相同但参数列表不同,由编译器依据参数类型/个数/顺序匹配;重写是运行时动态多态,子类中方法名、参数列表、返回类型(协变)与父类一致,由jvm根据对象实际类型调用。

方法重载和方法重写都体现多态,但它们发生的时机、绑定方式和作用目标完全不同。
重载是编译期决定的“静态多态”
编译器在编译阶段就根据调用处传入的实际参数类型、个数和顺序,从同一类中多个同名方法里选出唯一匹配的一个。这个选择过程不依赖对象实际类型,也不需要运行起来。
- 比如调用
print("hello"),编译器直接锁定print(String s),哪怕该方法后面被删掉,编译就会报错 - 即使通过父类引用调用子类对象的方法,只要参数不同,重载也按引用类型(编译时类型)来选方法
- 没有继承关系也能重载;它只关心“当前类里有没有参数匹配的方法”
重写是运行期决定的“动态多态”
编译时只检查语法是否符合重写规则(方法名、参数、返回值一致等),真正执行哪份代码,要等到程序运行、对象创建完成之后,由JVM 根据对象的实际类型(而非引用类型)来动态分派。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 例如
Animal a = new Dog(); a.makeSound();,编译时只知道a是Animal类型,但运行时发现它实际是Dog实例,于是调用Dog的makeSound - 这种机制支撑了“一个接口,多种实现”,是面向对象扩展性和可维护性的核心
- 必须有继承或实现关系;没有父类方法,子类单独写一个同名方法只是新方法,不是重写
关键区别一句话总结
重载看你写了什么参数,编译时就定死;重写看你new的是什么对象,运行时才落槌。
为什么这个区分很重要
混淆二者容易导致预期外的行为。例如:
- 本想靠重写实现多态,却因参数类型写错(比如父类是
Object,子类写了String),结果变成重载——编译通过,但运行时根本不会走子类逻辑 - 在多态调用中混用重载,可能让方法选择逻辑变得难以追踪,尤其涉及自动装箱、泛型擦除时
-
@Override注解能帮你在写重写时及时暴露拼写错误或签名不匹配,但它对重载完全无效
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










