Java抽象类通过编译器强制子类实现抽象方法:具体子类必须覆盖所有抽象方法,抽象子类可延迟实现;抽象方法无方法体、不可为private/static/final;抽象类可含具体方法,支持模板方法模式。

Java 中抽象类通过定义抽象方法,来强制子类提供具体实现。这种机制不是靠运行时检查,而是由编译器在编译阶段直接验证——只要子类是具体类(非 abstract),就必须覆盖父抽象类中的所有抽象方法,否则无法通过编译。
抽象方法必须用 abstract 声明且无方法体
抽象方法只有声明,没有实现(即没有大括号和方法体),语法形如:
abstract void doSomething();
它不能是 private、static 或 final;访问修饰符可以是 public、protected 或默认(包级私有),但子类重写时不能更严格(比如父类是 protected,子类不能改成 private)。
子类是否必须实现,取决于它是不是具体类
- 如果子类是普通类(未加 abstract 修饰),就必须实现所有继承来的抽象方法,一个都不能少。
- 如果子类自己也声明为 abstract,那它可以不实现,把责任继续向下传递给它的子类。
- 普通类(非 abstract)里如果写了抽象方法,代码根本通不过编译——抽象方法只能出现在抽象类或接口中。
抽象类本身可以包含已实现的方法
抽象类不只是“空壳”。它可以混用抽象方法和具体方法,比如提供通用逻辑的模板方法(template method),再留出几个抽象钩子(hook)让子类定制。例如:
public abstract class DataProcessor {
public final void process() {
load();
transform();
save();
}
protected abstract void load();
protected abstract void transform();
protected abstract void save();
}
这样既保证流程统一,又把关键步骤交给子类决定。
错误常见于漏写 @Override 或方法签名不匹配
即使写了方法体,如果方法名、参数类型、返回值类型或 throws 声明与父类抽象方法不一致,编译器仍会报错“must implement abstract method”。建议始终加上 @Override 注解,让 IDE 和编译器帮你校验签名是否正确。


















