抽象类通过抽象方法设编译期硬约束、模板方法锁主干流程、protected abstract暴露关键决策点、构造器+final字段守初始化底线,确保子类合规扩展。

靠抽象方法划出不可绕过的底线,再配合模板方法把流程定死,子类就只能在指定位置填自己的逻辑,没法跳过、没法乱改。
抽象方法是编译期硬约束
在抽象类里写一个没大括号、没实现体的方法,并用 abstract 修饰,比如:protected abstract void executeCore();
这个方法只声明“要做什么”,不告诉“怎么做”。只要子类不是 abstract 类,就必须提供对应签名的实现,否则编译直接失败——不是警告,是报错,根本跑不起来。
- 方法必须用 public 或 protected,不能是 private、static 或 final
- 参数类型、返回类型(支持协变)、异常声明都构成契约,子类必须严格匹配
- 漏实现一个?编译器会明确提示:
class Xxx must either be declared abstract or implement abstract method xxx in Yyy
模板方法锁住主干流程
光有抽象方法只能卡住“有没有写”,管不住“什么时候调、前后干啥”。真正起作用的是把不变的流程写成 final 方法,把可变环节抽出来设为抽象方法:
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
- 比如定义
public final void process() { validate(); executeCore(); notify(); } -
validate()和notify()是父类自带的具体方法,所有子类复用 -
executeCore()是抽象方法,每个子类必须自己实现,但只能在这个固定位置被调用
用 protected abstract 精准暴露核心变量点
业务中真正需要差异化的地方,往往不是整个流程,而是几个关键决策点。把这些点声明为 protected abstract,既限定访问范围,又明确责任归属:
protected abstract BigDecimal calculatePrice(Order order);protected abstract String generateLockKey(Order order);- 子类不用操心校验、日志、事务,只专注回答“我怎么算价”“我按什么规则锁库存”
构造器 + final 字段守住初始化底线
抽象类虽不能 new,但它的构造器会在子类实例化时自动触发。在这里做参数校验、赋值 final 字段,就能确保子类一创建就合规:
- 字段声明为
protected final String endpoint;,必须在构造器里赋值 - 构造器里检查
Objects.requireNonNull(endpoint),非法值直接抛异常 - 子类构造器第一行必须调
super(endpoint),绕不开、偷不了懒
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










