Java抽象类通过抽象方法实现编译期强制实现,要求非abstract子类必须覆盖所有抽象方法,否则编译失败;抽象方法无方法体且所在类必须声明为abstract,不可实例化;配合模板方法与钩子方法,分离流程与变化点,支持可选扩展。

Java 中抽象类通过抽象方法约束子类,核心在于“编译期强制实现”——只要子类不是 abstract 的,就必须覆盖父类所有未实现的抽象方法,否则无法编译通过。
抽象方法必须定义在 abstract 类中
抽象方法本身没有方法体(连大括号都不能有),例如:
abstract String generateId();
包含它的类必须用 abstract 修饰。这类不能被 new 实例化,只作为契约模板存在。
子类必须全部实现,否则编译失败
非 abstract 的子类一旦继承该抽象类,编译器会逐个检查是否实现了所有抽象方法:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 漏实现一个?报错:class XXX must either be declared abstract or implement abstract method YYY in ZZZ
- 参数类型不一致(如 List vs ArrayList)、返回类型不协变、访问修饰符更严格(public → protected),都不算有效实现
- private / static / final 不能修饰抽象方法——它们与“被子类重写”的语义冲突
配合模板方法,把流程和变化点分开
光靠抽象方法只能卡住“有没有”,真正落地要靠模板方法模式:
立即学习“Java免费学习笔记(深入)”;
- 用 final 方法封装不变流程(如日志、校验、事务、结果包装)
- 把可变环节声明为 protected abstract 方法,留给子类填空
- 例如统一支付处理:preValidate() → calculateFee() → persist() → notify(),其中 calculateFee() 是抽象方法
用钩子方法支持可选扩展
除了强制实现的抽象方法,还可提供空的 protected 方法作为扩展点:
- 例如 protected void onPaymentSuccess(Order order) { } —— 默认无逻辑
- 风控子类可重写它加审计日志,普通子类无需改动
- 命名建议用 onXXX 或 afterXXX 前缀,语义清晰,不破坏契约

















