Java抽象类通过编译器强制子类实现抽象方法:非abstract子类必须严格重写所有未实现的抽象方法,否则编译报错;配合模板方法可确保流程一致性与扩展性。

Java 中抽象类继承强制子类实现抽象方法,靠的是编译器在编译阶段的硬性检查——只要子类不是 abstract 类,就必须覆盖父类中所有未实现的抽象方法,否则直接报错,无法通过编译。
编译期强制校验:不实现就通不过
这个机制不是运行时提醒,也不是文档约定,而是 Java 编译器(javac)逐行扫描后触发的静态检查:
- 如果子类是普通类(非 abstract),且继承了含抽象方法的抽象类,编译器会列出所有未实现的抽象方法
- 报错格式典型为:
class XXX must either be declared abstract or implement abstract method YYY in ZZZ - 哪怕只漏一个、参数类型写成
ArrayList而不是父类声明的List,都不算有效重写 - 返回类型需协变(如父类返回
Object,子类可返回String),但不能换成无关类型或基本类型
抽象方法的签名必须严格匹配
子类重写抽象方法时,不是“看着像就行”,而是有明确的语义约束:
分析 Java Spring Boot 后端 Controller 代码,自动生成 Markdown 格式的接口文档。当用户说“生成 Java 接口文档”、“生成 API 文档”、“从 Spring 代码生成文档”时触发。
- 方法名、参数数量与类型顺序必须完全一致
- 访问修饰符不能比父类更严格:父类是
public abstract,子类不能写protected或private - 不能用
static、final、private修饰重写后的方法——这些和“被继承覆盖”的本质冲突 - 抽象方法本身不能出现在普通类中,也不能有方法体(连空大括号
{}都不允许)
配合模板方法,让强制更有意义
光靠抽象方法只能卡住“有没有写”,真正落地要靠模板方法把流程和变化点分开:
立即学习“Java免费学习笔记(深入)”;
- 在抽象类中定义
final public void process(),封装固定流程(如校验 → 执行 → 记日志) - 其中关键步骤声明为
protected abstract void doExecute();,子类必须实现 - 子类无法绕过
process()的执行顺序,也不能覆盖整个流程,但必须填上自己的核心逻辑 - 这样既守住结构一致性,又把业务差异收口到明确的抽象方法里
子类也可以选择不实现:那就继续抽象
继承链上允许“延迟实现”,但最终必须落地:
- 子类若也声明为
abstract,可以只实现部分抽象方法,甚至一个都不实现 - 但只要某一级子类去掉
abstract修饰,它就必须补全从顶层抽象类继承下来的所有未实现抽象方法 - 这种设计支持分层契约:基础抽象类定义通用行为,中间抽象类聚焦领域共性,具体子类专注场景细节

















