java抽象类通过abstract方法约束子类行为、final模板方法锁定流程顺序,实现“骨架稳定、细节可变”;抽象方法须在abstract类中声明且无实现,模板方法为public final具体方法,钩子方法提供可选扩展。

Java 中抽象类定义抽象方法和模板方法模式,核心在于用 abstract 契约约束子类行为,再用 final 模板方法 锁定流程顺序——两者配合,才能真正实现“骨架稳定、细节可变”的设计意图。
抽象方法必须声明在 abstract 类中,且不带实现体
抽象方法只声明接口,不写大括号和逻辑。语法上必须满足:
- 所在类必须用
abstract class声明;类中只要有一个抽象方法,就强制要求类本身是 abstract - 方法声明以
abstract开头,返回类型后直接加分号,例如:protected abstract void deductStock(); - 不能是 private 或 static ——private 子类不可见,static 无法被重写,都违背“交由子类实现”的初衷
- 访问修饰符只能是
public或protected,推荐用protected,既保证子类可覆盖,又避免外部直接调用
模板方法必须是 public final 具体方法,封装完整流程
模板方法不是抽象的,而是父类里已写死的执行逻辑,作用是控制“谁先谁后”。关键要求:
- 声明为
public final,比如public final void processOrder(),禁止子类重写,防止流程错乱 - 内部按真实顺序调用抽象方法和其他具体方法,如:
validate(); deductStock(); calculatePrice(); notifyUser(); - 所有稳定逻辑(参数检查、事务开启、日志记录、结果包装)都放在这里,不分散到子类
- 避免在模板方法中调用
this的非 final 实例方法,否则子类可能在构造未完成时介入,引发空指针或状态异常
用钩子方法替代 if 判断,支持轻量扩展
不是每个环节都必须执行,有些是“视情况而定”。这类逻辑不要塞进模板方法里写条件分支,而是提取为钩子:
- 声明为
protected,带空实现,例如:protected boolean shouldLogAudit() { return false; } - 命名体现语义:以
should、is、before、after开头,如beforePayment()、afterSuccess() - 钩子里只做决策或副作用操作(打点、发消息),不放耗时 IO 或复杂计算
- 子类按需覆盖,不影响主流程,也不强制实现
子类只需专注最小实现,其余全部复用
继承抽象类后,子类职责非常清晰:
- 必须实现所有
protected abstract方法,一个都不能少;漏掉会导致编译失败 - 可选择性覆盖钩子方法,不覆盖就走默认空逻辑
- 不能重写模板方法(final 限制)、不能修改流程顺序、不能绕过父类校验
- 例如秒杀订单子类只实现
deductStock()(Redis 原子扣减)和getPrice()(取预设价),其余通用逻辑全由父类提供
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











