抽象类通过abstract方法强制子类实现核心逻辑,配合final模板方法锁定执行流程,封装可复用的公共能力与钩子机制,兼顾约束性与扩展性。

抽象类本身不提供完整业务逻辑,它的作用是划清边界、收住主干、留出空位;真正跑起来的业务逻辑,必须由具体子类补全抽象方法,并复用父类已封装的能力。
用 abstract 方法强制子类填关键空
抽象类中声明的 abstract 方法没有方法体,只定义“要做什么”,比如 protected abstract void executeCore(); 或 public abstract BigDecimal calculatePrice(Order order);。子类一旦继承这个抽象类,就必须实现这些方法——编译器会直接报错,不实现就过不了编译。
- 访问修饰符只能是 public 或 protected,不能是 private、final、static
- 子类实现时建议加上 @Override 注解,避免签名写错导致隐式继承而非重写
- 如果子类暂时不想实现全部,它自己也得声明为 abstract,但最终落地仍需非抽象子类来完成
靠模板方法把流程骨架锁死
光有 abstract 方法只能卡住入口,控制不了执行顺序。实际业务中,90% 的抽象类都会配合一个 public final void process() 这样的模板方法:里面按固定顺序调用校验、核心处理、通知等步骤,其中只有核心环节是 abstract 的,其余都是父类写好的具体逻辑。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 例如:validate() → executeCore() → notifySuccess(),前和后是父类实现,中间是子类负责
- final 保证子类无法覆盖整个流程,防止误改调用顺序或跳过关键步骤
- 子类只需专注自己的那一段逻辑,不用操心“什么时候调”“前后该做什么”
让具体子类复用公共能力,减少重复编码
抽象类不是空壳,它可以包含字段、构造器、普通方法、静态工具方法等。这些都属于可继承、可复用的资产。
立即学习“Java免费学习笔记(深入)”;
- 比如统一的日志上下文初始化、幂等 key 生成(protected final String generateIdempotentKey())
- 共用的参数校验逻辑、HTTP 客户端封装、重试机制
- 子类通过 super() 调用父类构造器,初始化 name、config 等共享字段
预留钩子应对少数特殊场景
有些动作大多数子类不需要干预,但个别业务线需要插一脚,比如风控增强、灰度开关、异步补偿。这时在抽象类里加一个空的 protected void onOrderCreated(Order order) { } 就行。
- 默认空实现,不影响现有子类
- A 子类重写它发审计日志,B 子类重写它触发延迟任务,C 子类完全不碰
- 比在每个子类里硬加 if-else 更清晰,也更符合开闭原则

















