抽象类通过“划底线+定骨架+给工具”三步设计:用abstract方法强制子类实现关键行为,用模板方法(public final)锁定主干流程并预留可变点,用具体方法、字段和构造器共享通用能力,体现is-a关系且支持状态与逻辑复用。

抽象类通过“划底线 + 定骨架 + 给工具”三步协同设计,既强制子类实现关键行为,又让子类能复用稳定逻辑,不是空泛约束,而是可落地的协作契约。
用抽象方法划出不可绕过的底线
在抽象类中声明 abstract 方法,只写签名、不写实现体,例如:
protected abstract void doPayment();
子类只要不是 abstract 类,就必须提供具体实现——编译器会直接报错,不给绕过机会。
- 方法访问权限必须是 public 或 protected(不能 private、static、final)
- 参数类型、返回值(支持协变)、抛出异常都构成契约,子类重写时不得更改
- 漏实现一个?编译提示明确:class Xxx must either be declared abstract or implement abstract method
用模板方法锁住主干流程
光有抽象方法只能管“有没有写”,管不住“怎么用”。真正起效的是把稳定流程封装成 public final 方法,再把可变点抽成抽象方法:
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
- 例如:public final void execute() { validate(); doPayment(); notify(); }
- 其中 validate() 和 notify() 是父类已实现的具体方法,所有子类自动复用
- doPayment() 是抽象方法,子类必须实现,但只能在这个固定位置被调用
- 这样既防流程错乱,又把定制权精准留给子类
用具体方法、字段和构造器共享通用能力
抽象类不是空壳,它自带状态与逻辑,让子类少写重复代码:
- 把日志、校验、事务等稳定逻辑写成 protected 或 public 具体方法,子类直接继承调用
- 声明 protected final OrderService orderService; 等共用字段,在抽象类构造器中初始化
- 子类通过 super(config) 触发父类构造,天然获得服务对象和初始化状态
- 避免每个子类都写一遍 beginTransaction() 或重复注入相同依赖
设计时注意语义与边界
抽象类体现的是 is-a 关系,不是功能拼凑。选对场景才能发挥价值:
- 适合有共性基础的类族:比如 Animal、Shape、PaymentChannel
- 不适合跨类型能力组合(如“能飞”“能存储”),这种应优先用接口
- 一个类只能继承一个抽象类,但可实现多个接口——若未来可能需多继承语义,要提前评估扩展性
- 抽象类可含静态方法、普通字段、构造器;接口不能定义实例字段或构造器,这是本质区别
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










