抽象类表达is-a关系,定义“它是什么”,强调身份继承与状态复用;接口表达can-do关系,定义“它能干什么”,强调能力契约与行为规范。

别一上来就背“接口用 implements,抽象类用 extends”——面试官真正想听的,是你有没有把语法差异背后的设计意图吃透。追问一来,卡壳的往往不是记不住条目,而是没分清哪些是表层规则、哪些是底层约束。
先锚定一句话:is-a 还是 can-do?
这是所有追问的起点。回答时直接点明:
-
抽象类回答“它是什么”:比如
AbstractPaymentService表示“这是一个支付服务”,子类(微信、支付宝)天然继承其身份、状态(如商户密钥、日志器)和流程骨架; -
接口回答“它能干什么”:比如
Retryable、Exportable、Notifiable,不关心实现者是订单、用户还是风控规则,只约定“你必须提供重试方法”“你必须支持导出格式”。
这句话立住,后面所有语法差异就都能自然推导出来——不是死记,而是顺逻辑。
被问“JDK 8+ 接口有 default 方法,那和抽象类还有区别吗?”
重点不在“能不能写实现”,而在为什么这么设计、能做什么、不能做什么:
- 接口的
default方法不能访问实例字段(没有this状态),只能做无状态辅助逻辑,比如Collection.sort()或通用校验工具; - 抽象类的具体方法可以操作
protected字段、调用子类未实现的钩子、控制模板流程(如统一验签 → 调用渠道 → 处理回调); - 接口不能有构造器,无法初始化共享资源;抽象类有构造器,能封装配置加载、连接池初始化等一次性动作。
被问“什么时候该选接口,什么时候该选抽象类?”
直接用三个落地问题判断,不讲虚的:
- 这个能力将来会不会被完全无关的类复用?比如“可缓存”“可审计”“可重试”——选接口;
- 这几个类之间有没有共用的状态或高度一致的执行流程?比如都用同一套签名逻辑、都依赖同一个配置对象、都有“预校验→执行→后处理”三步走——选抽象类;
- 一个类是否需要同时具备多种正交能力?比如“既是支付渠道,又支持异步回调,还能生成对账单”——必须靠接口组合,抽象类单继承做不到。
被问“举个你项目里真实用过的例子”
选一个有“变与不变”张力的场景,比如聚合支付退款:
- 不变的部分:金额校验、单号生成、日志记录、结果通知——抽到
AbstractRefundService的具体方法里; - 变的部分:构建渠道参数、调用渠道 API、解析响应——声明为抽象方法,由
WechatRefundService、AlipayRefundService各自实现; - 额外能力:如果某渠道要支持“失败自动重试”,就让其实现
Retryable接口,不污染主继承链,也不影响其他渠道。
这样讲,面试官立刻能判断你是不是真写过可维护代码,而不是只读过教材。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











