重载和重写是开源框架支撑可扩展性、易用性与多态行为的关键设计手段:重载通过同名不同参提升api可用性(如spring的getbean系列),重写通过子类/实现类定制行为落实开闭原则(如mybatis的typehandler),二者常协同构建弹性分层结构。

重载和重写在开源框架源码中不是理论概念的堆砌,而是支撑可扩展性、易用性和多态行为的关键设计手段。它们以非常自然、高频的方式嵌入在日常使用的 API 里,往往开发者调用时浑然不觉,但框架作者正是靠这两者让代码既灵活又健壮。
重载:提升 API 可用性,常见于构造器与工具方法
开源框架大量使用重载来降低使用者门槛,避免“一个功能要记多个方法名”。典型体现:
-
Spring Framework 的
BeanFactory.getBean():提供至少 4 种重载版本——getBean(String)、getBean(Class<t>)</t>、getBean(String, Class<t>)</t>、getBean(Class<t>, Object...)</t>。参数不同(名字/类型/泛型/参数数组),语义一致(获取 Bean),编译器自动选最匹配的。 -
MyBatis 的
SqlSession.selectList():支持selectList(String)、selectList(String, Object)、selectList(String, Object, RowBounds)。不同场景传参更自由,无需封装 DTO 或空值占位。 -
Guava 的
ImmutableList.of():从of()(空列表)到of(E, E, E, ..., E)(最多 12 个参数),全靠重载实现“语法糖式”构建,比Arrays.asList(...).asList()更直观安全。
重写:实现行为定制,是框架扩展机制的核心支柱
重写让框架保留骨架逻辑,把可变部分交给用户实现,是“开闭原则”的直接落地。几乎所有主流框架都依赖它:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
-
Spring MVC 的
@Controller类中重写HandlerMethod相关方法:虽然不常手写,但RequestMappingHandlerAdapter内部会调用用户 Controller 方法——这些方法本质是重写了父类(如ServletInvocableHandlerMethod)约定的执行契约。 -
MyBatis 的
TypeHandler接口实现类:框架定义了TypeHandler<t></t>接口(含setParameter()、getResult()等抽象方法),用户自定义类继承并重写这些方法,即可接管任意数据库类型与 Java 类型之间的转换逻辑。 -
Spring Boot 的
CommandLineRunner和ApplicationRunner:二者都是函数式接口,用户实现类必须重写run()方法。Spring 容器启动后按顺序调用所有重写后的run(),完成初始化任务——这是典型的“模板+重写”模式。
重载 + 重写混合使用:增强框架弹性
真实框架中二者常协同出现,形成分层抽象:
-
Spring Data JPA 的
JpaRepository:接口本身是泛型重载(JpaRepository<user long></user>、JpaRepository<order integer></order>),而它的默认实现类SimpleJpaRepository则重写了父接口中声明的所有方法(如save()、findAll())。用户还可再继承SimpleJpaRepository并重写特定方法(如定制 save 逻辑),形成“接口重载 → 默认实现重写 → 用户二次重写”的三级弹性链。 -
Apache Commons Lang 的
ToStringBuilder:构造器重载支持多种风格(reflectionToString()有 5 种签名),而每个风格内部又依赖用户重写的toString()方法来生成内容——重载负责“怎么构”,重写负责“输出什么”。
看源码时怎么快速识别
不用逐行读,抓住三个信号即可定位:
- 重载线索:同一个类里,方法名完全一样,IDE 显示多个灰色小箭头(或 Ctrl+Click 进去看到多个同名方法)、参数列表明显变化(个数/类型/顺序)、返回值常不同但非必需。
-
重写线索:子类中出现
@Override注解;方法签名(名+参数)与父类/接口中某方法一模一样;方法体逻辑明显不同于父类默认实现(比如父类抛UnsupportedOperationException,子类写了真实逻辑)。 -
关键提醒:别被
static或private方法干扰——它们不能被重写,即使签名相同也只是“隐藏”;而重载对static完全友好,静态工具类(如Objects、CollectionUtils)是重载高发区。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










