抽象类通过强制实现、模板方法和钩子机制约束子类行为:abstract方法划定编译期契约,final模板方法固化主流程,protected钩子支持安全扩展,共享字段与工具方法提供统一基线。

Java 架构设计中,抽象类控制子类扩展行为的核心不是“放任重写”,而是通过结构化约定主动引导和约束——用强制实现划清底线,用模板封装稳定流程,用钩子预留安全入口。
用抽象方法定义不可绕过的契约
抽象类中声明的 abstract 方法没有方法体,子类若非 abstract,就必须全部实现。编译器会逐项检查:方法名、参数类型(需精确匹配或协变)、返回类型、访问修饰符(不能比父类更严格,如 public 不可降为 protected)。这相当于在编译期钉死行为边界。
- 例如定义 abstract void validate();,所有业务处理器子类都必须提供校验逻辑,不能跳过
- 参数用 List 而非 ArrayList,避免子类因类型不匹配导致编译失败
- private / static / final 不能修饰抽象方法——它们与“由子类覆盖”的语义直接冲突
用模板方法固化主干流程
把不变的执行顺序封装在 final 方法中,内部调用受保护的抽象或空实现方法,让子类只专注变化点。主逻辑不开放重写,从根本上防止误覆盖。
- 比如 final void execute() { preCheck(); doWork(); postSave(); }
- 其中 doWork() 是 abstract,强制子类实现核心动作
- preCheck() 和 postSave() 可设为 protected void 空方法,供有需要的子类选择性增强
用钩子方法支持非破坏式扩展
提供命名清晰的 protected 空方法(如 onSuccess()、beforeCommit()),子类重写时不干扰原有流程,也不依赖手动调用 super。父类升级新增钩子时,已有子类不受影响。
- 风控模块可重写 onPaymentSuccess() 加审计日志
- 普通支付子类保持默认空实现,无需任何改动
- 相比“重写主方法 + super.xxx()”方式,这种设计更健壮、更易维护
共享能力支撑统一行为基线
抽象类可包含构造器、字段、protected 工具方法、静态工具类等,为所有子类提供一致的初始化方式、状态管理能力和基础服务,避免各子类重复造轮子。
- 构造器中统一设置 traceId、初始化共用 client
- 定义 protected String buildKey(Object... args) 统一缓存键生成逻辑
- 声明 protected final Logger log = LoggerFactory.getLogger(getClass());
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











