抽象类通过强制实现抽象方法和共享具体方法来规范子类行为:抽象方法定义契约,子类必须实现;具体方法封装通用逻辑,支持复用;模板方法模式用final方法固定流程、抽象方法定制变化点;体现“is-a”关系,可含字段、构造器,适用于需共享状态或控制初始化的场景。

Java 中抽象类通过“强制实现 + 共享实现”来规范子类的公共行为:既划清子类必须完成的边界,又提供可复用的基础逻辑,让子类在统一框架下灵活扩展。
用抽象方法定义行为契约
抽象类中声明 abstract 方法,只写签名(名称、参数、返回类型),不写方法体。这相当于给所有子类立下硬性约定——必须自己实现这个行为。
- 子类若未全部实现抽象方法,编译直接报错;除非该子类也声明为 abstract
- 抽象方法不能是 private、final 或 static,否则违背“留给子类覆盖”的设计本意
- 例如:
public abstract void draw();要求Circle、Rectangle等子类各自写出具体的绘制逻辑
用具体方法封装通用逻辑
抽象类不是空壳,它可以包含完整实现的方法,子类自动继承、直接调用,避免重复编码。
分析 Java Spring Boot 后端 Controller 代码,自动生成 Markdown 格式的接口文档。当用户说“生成 Java 接口文档”、“生成 API 文档”、“从 Spring 代码生成文档”时触发。
- 比如
displayInfo()方法内部调用抽象的area(),再统一打印格式,子类只需专注实现area()即可 - 构造器、字段、protected 工具方法等也能共享状态和初始化流程,这是接口做不到的
- 典型例子:
java.util.AbstractList提供了isEmpty()、iterator()等默认实现,子类只实现get(int)和size()就能正常工作
用模板方法统一流程骨架
把稳定不变的执行步骤写在抽象类中,用 final 修饰防止子类篡改;把变化点抽成抽象方法,强制子类定制。
立即学习“Java免费学习笔记(深入)”;
- 例如支付模板:
pay()是 final 的,固定执行checkOrder → doPay → recordLog - 其中
doPay()是抽象的,由AliPayTemplate、WechatPayTemplate各自实现 - 这样既保证业务流程不乱,又支持不同渠道的差异化处理
设计时注意语义与边界
抽象类表达的是 “is-a” 关系(如 Dog 是一种 Animal),强调血缘与共性,不是单纯的行为集合。
- 它可含字段、构造器、非 public 成员,适合需要共享状态或控制初始化顺序的场景
- 没有抽象方法的抽象类也是合法的——只要目的是禁止实例化并提供默认实现(如框架基类
AbstractController) - 如果一个类既无抽象方法,又没提供任何可复用逻辑,那它大概率不该是抽象类

















