Java抽象类通过编译期强制与final模板方法固化“必须做什么”和“必须按什么顺序做”,用abstract方法立下不可绕过契约,子类须实现所有抽象方法;final模板方法锁定流程骨架,protected字段与构造器共享上下文,面向抽象编程实现解耦与可扩展。

Java 抽象类通过编译期强制 + 模板方法封装,把“必须做什么”和“必须按什么顺序做”一起固化下来,让子类无法跳过关键步骤、也无法随意调整流程。
用抽象方法划出行为底线
在抽象类中声明 abstract 方法,就是给子类立下不可绕过的契约:
- 方法只有签名(名称、参数、返回类型、异常),没有方法体
- 子类若是具体类(非 abstract),就必须用 @Override 实现每一个抽象方法,否则编译直接失败
- 修饰符只能是 public、protected 或包级默认,不能是 private、static、final
- 参数类型、返回类型(支持协变)、抛出异常必须严格匹配,改错一个就不是重写
用 final 模板方法锁住执行骨架
光有抽象方法只能管“有没有实现”,真正起规范作用的是把稳定流程写死在 final 方法里:
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
- 定义一个 public final 方法,比如 process(),内部按固定顺序调用若干步骤
- 其中通用逻辑(如校验、日志、事务)写成具体方法,子类自动继承复用
- 可变环节(如 doTransfer()、sendSms())声明为 abstract,强制子类填充
- 子类无法重写模板方法,也不能跳过某个 hook,流程一致性由父类保障
用 protected 字段和构造器共享上下文
抽象类不是空接口,它能持状态、能初始化,让子类在统一约束下获得一致运行环境:
立即学习“Java免费学习笔记(深入)”;
- 声明 protected final Service service;,在构造器中完成注入或创建
- 子类通过 super(config) 触发父类构造,天然获得可用依赖
- 避免每个子类重复写初始化逻辑,也防止因字段缺失导致行为偏差
- 字段设为 protected,既允许子类访问,又不对外暴露细节
面向抽象编程,上层只认父类类型
业务代码不依赖具体子类,而是以抽象类为统一入口,实现解耦与可扩展:
- 变量、参数、返回值都声明为抽象类类型,例如 PaymentProcessor processor = new WechatPay();
- 调用 processor.execute() 时,实际执行的是子类实现的抽象方法,但流程由父类控制
- 新增子类(如 ApplePay)不影响已有调用方,也不需要修改模板逻辑
- 配合工厂或策略模式,运行时动态选择子类,规范始终在线

















