抽象类通过模板方法模式和抽象方法约束子类行为,规范“怎么调”与“必须做什么”。它用final模板方法固化流程(如process()),以abstract方法强制子类实现关键环节,配合protected成员复用逻辑,并与接口协同实现契约与复用分离。

抽象类本身不直接定义“方法调用规范”,而是通过模板方法模式 + 抽象方法约束,让子类在统一流程下实现差异化逻辑。它规范的是“怎么调”和“必须做什么”,而不是接口层面的“能怎么调”。
用模板方法固化调用流程
把不变的执行顺序写死在抽象类里,用 final 修饰,强制所有子类遵循同一入口和步骤。
- 定义一个 public final 方法(如 process()),内部按序调用 load() → validate() → transform() → save()
- 其中 load()、validate() 等提供默认实现;transform()、save() 等关键环节声明为 protected abstract,由子类实现
- 调用方只需 new 子类对象后调用 process(),无需关心内部细节,也不允许跳过或打乱步骤
用抽象方法明确子类责任
抽象方法是契约的核心——它不提供实现,但要求子类必须覆盖,否则编译失败。
- 方法签名要语义清晰,比如 isValid() 返回布尔值判断前置条件,而不是 void doCheck()
- 避免在抽象方法中传入复杂上下文对象(如 Map
),优先用明确参数类型(如 String id, long timestamp) - 不建议返回泛型通配符(如 List>),应指定具体类型(如 List
)或使用泛型抽象类(如 abstract class Processor )
用受保护成员协调内部协作
抽象类可声明 protected 字段或工具方法,供子类安全复用,避免重复造轮子,又不破坏封装边界。
- 例如定义 protected final ObjectMapper json = new ObjectMapper();,子类直接使用,无需自行初始化
- 可提供通用校验工具方法:protected boolean isEmail(String s) { return s != null && s.contains("@"); }
- 禁止定义 public 字段或 public 工具方法——这会暴露实现细节,削弱抽象层级
配合接口提升调用一致性
纯契约交给接口,复用逻辑交给抽象类,两者结合才能兼顾规范性与灵活性。
- 定义接口 Exportable 声明 export() 方法,作为对外统一能力标识
- 抽象类 BaseExporter 实现 Exportable,并提供公共序列化、压缩逻辑
- 具体导出器(如 CsvExporter、JsonExporter)继承 BaseExporter,只专注格式转换
- 上层代码面向 Exportable 编程,运行时注入任意子类,调用方式完全一致
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











