抽象方法的核心作用是强制子类实现特定方法,统一流程骨架并保留实现灵活性;需用abstract修饰、无方法体,所在类也须为abstract;不可为private或final,推荐public;常用于模板方法模式,配合钩子方法提升扩展性。

抽象方法的核心作用,就是在父类中“留空”一个方法签名,强制子类必须实现它,从而统一业务流程的骨架,又保留具体实现的灵活性。
用 abstract 修饰方法,让子类无法绕过实现
在父类中声明抽象方法时,不写方法体(连大括号都不加),且类本身必须用 abstract 修饰。这样编译器会确保:任何非抽象子类,都必须重写这个方法,否则编译失败。
- 抽象方法不能是 private 或 final(private 子类不可见,final 不可重写)
- 抽象方法可以是 protected 或 public;推荐用 public,便于框架调用或测试
- 抽象方法可带参数、返回值、异常声明,这些共同构成子类必须遵守的契约
把标准流程写在父类模板方法里,抽象方法只负责“插槽”
典型做法是定义一个 模板方法(Template Method):它是一个具体方法,封装了不变的执行顺序,其中关键可变环节调用抽象方法。子类只管填空,不破坏流程。
- 例如订单处理流程:validate() → calculateFee() → persist() → sendNotification(),其中 calculateFee() 设为抽象,不同订单类型(普通/会员/团购)各自实现计费逻辑
- 父类模板方法内可做公共校验、日志、事务控制等,避免子类重复劳动
- 子类不能重写模板方法本身(可设为 final),防止流程被篡改
配合钩子方法(Hook Method)提供可选扩展点
除了强制实现的抽象方法,父类还可定义空的 protected 方法(即钩子),子类按需选择性重写。它不破坏约束,但增强扩展性。
- 比如模板方法末尾调用 onAfterProcess(),默认为空实现;风控子类可重写它追加审计日志,普通子类就不用管
- 钩子方法命名建议带 onXXX 或 afterXXX 前缀,语义清晰
- 它和抽象方法互补:一个“必须填”,一个“可以填”
实际编码注意点
抽象类不是接口,它可以含字段、构造器、具体方法——合理利用这点组织共用资源。
- 父类构造器可用于初始化共享状态(如配置对象、线程安全的缓存容器)
- 抽象方法的参数尽量用接口或基类(如 List
而非 ArrayList ),提高子类实现自由度 - 文档注释要明确说明该抽象方法的职责、前置条件、后置行为及可能抛出的业务异常










