抽象类通过final模板方法固定算法骨架,强制子类实现抽象方法、选择性重写钩子方法,复用具体方法,确保流程统一且可扩展。

用 final 修饰模板方法,锁定执行流程
模板方法本身必须不可被子类覆盖,否则整个流程就失控了。所以要用 public final void 声明,内部按顺序调用多个步骤方法:
- 这些步骤可以是抽象方法(强制子类实现)
- 也可以是具体方法(父类已提供默认行为)
- 还可以是钩子方法(空实现,子类选择性重写)
区分三类方法:抽象、具体、钩子
一个清晰的抽象模板类通常包含:
-
抽象方法:用
abstract声明,无方法体,子类必须实现(如brew()、addCondiments()) -
具体方法:已有完整逻辑,子类可直接继承使用(如
boilWater()、pourInCup()) -
钩子方法:声明为
protected void xxx() {},默认不做事,子类按需重写(如shouldAddMilk()返回布尔值控制后续分支)
子类只负责“填空”,不干预流程
子类继承抽象类后,只需实现抽象方法,或重写钩子方法,其余逻辑全部由父类模板方法自动串联:
- 不用手动调用
super.xxx(),避免遗漏或顺序错乱 - 新增步骤时,父类在模板方法中插入新钩子,所有子类自动兼容
- 流程变更(比如加一步预处理)只改父类,不碰子类代码
典型结构示例
比如饮料制作模板:
abstract class Beverage {
// ✅ 模板方法:流程不可变
public final void prepareRecipe() {
boilWater();
brew(); // 抽象方法,子类实现
pourInCup();
addCondiments(); // 抽象方法,子类实现
}
// ✅ 具体方法:统一逻辑
void boilWater() { System.out.println("烧开水"); }
void pourInCup() { System.out.println("倒入杯中"); }
// ❓ 抽象方法:子类必须填空
abstract void brew();
abstract void addCondiments();
}Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











