抽象方法强制子类实现契约,必须定义在抽象类中,无方法体、不可用private/static/final修饰,子类须全部实现或声明为抽象类,配合final模板方法可固化流程。

Java 中抽象方法强制子类实现特定契约,核心在于“编译期硬性约束”——不是靠文档提醒、运行时检查或约定俗成,而是由编译器直接拦截未落实的实现,不通过就报错。
抽象方法必须定义在抽象类中
抽象方法不能独立存在。只要类中有一个 abstract 方法,整个类就必须用 abstract class 声明。否则编译器会报错:“abstract method in non-abstract class”。
- 正确写法:
abstract class PaymentProcessor { abstract void execute(); } - 错误写法:
class PaymentProcessor { abstract void execute(); }→ 编译失败 - 抽象类可以没有抽象方法(极少用),但有抽象方法就一定得是抽象类
抽象方法本身不提供实现,只定义契约
它只声明“做什么”,不规定“怎么做”。语法上必须以分号结尾,**绝不能带方法体**(连空 {} 都不允许)。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 合法:
protected abstract BigDecimal calculateFee(Order order); - 非法:
abstract void init() {}→ 编译报错 - 不能用
private、static或final修饰——它们与“被子类重写”的语义冲突 - 推荐访问修饰符为
public或protected,确保子类能看见并覆盖
子类必须全部实现,否则无法编译通过
非抽象子类继承抽象类后,编译器会逐个检查所有继承来的抽象方法是否已被具体实现。漏掉任意一个,就拒绝编译。
立即学习“Java免费学习笔记(深入)”;
- 错误提示典型形式:“class Xxx must either be declared abstract or implement abstract method”
- 子类可选择不实现,但必须同步声明为
abstract class Xxx extends Parent,把契约继续向下传递 - 重写时签名必须严格匹配:方法名、参数类型、返回类型(支持协变)、异常声明;访问权限不能比父类更严格(如父类
protected,子类不能写private) - 强烈建议加上
@Override注解,避免拼写错误或参数类型不一致导致“看似重写实则新增方法”
结合模板方法固化流程,让契约落地更可靠
光靠抽象方法只能卡住“有没有写”,真正管住“怎么用”,要靠 final 模板方法封装主干逻辑,只把关键差异点暴露为抽象方法。
- 例如:
public final void handleRequest() { validate(); process(); log(); } - 其中
validate()和process()是protected abstract,子类必须定制 -
log()是父类已实现的具体方法,所有子类复用,无需重复编码 - 这样既保证执行顺序统一,又把业务核心逻辑的实现责任明确压给子类

















