Java中多态分为编译时多态(靠重载实现)和运行时多态(靠重写实现):重载发生在同一类中,方法名相同但参数列表不同,编译时绑定;重写发生在子类继承父类时,方法签名完全一致,运行时根据对象实际类型动态绑定。

Java 中的多态分为两种实现形式:编译时多态(静态多态)靠重载实现,运行时多态(动态多态)靠重写实现。它们不是并列关系,而是服务于不同场景的互补机制——重载解决“同一个类里怎么用同一方法名处理不同输入”,重写解决“子类如何替换父类行为以体现不同对象的不同表现”。
重载体现编译时多态:调用哪个方法由参数决定
重载发生在同一个类中,方法名相同但参数列表不同(类型、个数或顺序任一不同即可),编译器在编译阶段就根据实参类型和数量精准绑定到具体方法,不依赖对象实际类型。
- 返回值类型、访问修饰符、异常声明不影响重载判断,仅参数列表是关键
- 常见用途包括构造器多样化(Student()、Student(int id, String name))、工具方法适配(print(String)、print(int)、print(Object...))
- 注意:仅靠返回值不同无法构成重载,否则编译失败
重写体现运行时多态:执行哪个方法由对象实际类型决定
重写发生在继承链中,子类提供与父类签名完全一致(方法名、参数列表、返回类型)的方法实现,JVM 在运行时根据对象的真实类型(而非引用类型)选择调用版本,这是多态的核心能力。
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
- 必须满足“两同两小一大”:方法名和参数列表相同;返回类型和抛出异常范围更小(协变返回、子类异常);访问权限更大或相等
- 被 private、final、static 修饰的方法不能被重写
- 典型应用如 Animal a = new Dog(); a.move(); 实际执行的是 Dog 的 move(),而非 Animal 的
两者协同支撑完整多态体系
重载和重写可以共存,各自承担不同职责。例如一个图形绘制系统中:
立即学习“Java免费学习笔记(深入)”;
- 同一 Shape 类内可重载 draw() 方法(draw(Color c)、draw(Color c, int lineWidth))——提升调用灵活性
- Circle 和 Rectangle 继承 Shape 后分别重写 draw()——让同一句 shape.draw() 根据实际对象画出不同图形
- 这种组合既简化了接口使用(重载降低调用门槛),又实现了行为差异化(重写支持扩展性)
避免常见混淆点
初学者容易把两者混为一谈,关键区分在于发生位置、绑定时机和目的:
- 重载是“横向扩展”:同类中增加多种调用入口,提升易用性
- 重写是“纵向定制”:子类覆盖父类逻辑,支撑可插拔行为
- 重载无 @Override 注解,重写建议强制添加,便于编译检查
- 构造方法可重载,但不可重写(因为没有继承关系,且构造器名必须与类名一致)

















