抽象类回答“我是什么”(is-a关系),接口回答“我能做什么”(can-do关系);抽象类侧重共享状态与逻辑复用,接口侧重跨域能力契约与多继承解耦。

构建 Java 接口与抽象类的面试知识图谱,关键不是堆砌概念,而是理清“为什么这样设计”和“在什么场景下必须选它”。面试官真正想考察的,是你对面向对象抽象能力的理解深度,而非能否背出语法条目。
一、底层定位:先分清“是什么”和“能做什么”
这是所有混淆的根源。一句话锚定:
- 抽象类回答“我是什么”——体现 is-a 关系,有共同属性(如 name、age)、共享逻辑(如通用日志、模板方法)、构造流程(如初始化父类字段);
- 接口回答“我能做什么”——体现 can-do 关系,定义能力契约(如 Flyable、Serializable、Comparable),不关心实现者是谁、长什么样。
比如 Animal 是抽象类(猫、狗都“是”动物),而 Flyable 是接口(鸟、飞机、无人机都能飞,但毫无血缘关系)。
二、语法边界:哪些规则不能破,破了就编译失败
这些是高频考题,必须条件反射式掌握:
分析 Java Spring Boot 后端 Controller 代码,自动生成 Markdown 格式的接口文档。当用户说“生成 Java 接口文档”、“生成 API 文档”、“从 Spring 代码生成文档”时触发。
立即学习“Java免费学习笔记(深入)”;
- 抽象类可用 abstract class 声明,可含构造方法、普通字段、普通方法、静态方法、抽象方法;
- 抽象方法不能用 private / final / static 修饰(private 无法被子类访问,final 无法被重写,static 属于类而非实例);
- 接口默认所有方法是 public abstract(JDK 8 前),字段是 public static final;
- JDK 8+ 接口可含 default 和 static 方法,但 default 方法不能是 private 或 final;多个 default 方法冲突时,实现类必须显式重写;
- 类只能单继承抽象类,但可 implements 多个接口——这是突破 Java 单继承限制的核心手段。
三、设计选择:面试必问“什么时候用哪个?”
光讲区别不够,要能给出决策依据:
- 必须用抽象类:需要共享状态(如公共字段)、复用代码逻辑(如模板方法 pattern)、控制子类构造流程(如强制调用 super(...));
- 必须用接口:定义跨领域能力(如 Payment、Cacheable)、支持多继承语义(一个类既是 Runnable 又是 Comparable)、为解耦服务(Spring 中 Service 层全用接口,便于 Mock 和替换实现);
- 黄金组合:常见于框架设计,例如 Spring Data JPA 中,Repository 是接口(定义能力),SimpleJpaRepository 是抽象类(提供通用 CRUD 实现),具体 DAO 再继承它并注入数据源。
四、避坑点:面试官最爱挖的细节
这些地方答错,容易暴露理解浮于表面:
- “抽象类可以没有抽象方法”——对,比如 AbstractList;
- “接口里能写构造方法吗?”——不能,接口不是类,不参与实例化;
- “default 方法能访问 private 字段吗?”——不能,接口无实例字段,default 方法只能访问本接口的常量或传入参数;
- “Object 类的方法能在接口里重写吗?”——不能,equals/hashCode/toString 等已由 Object 定义,接口不能覆盖,但实现类可以重写。

















