接口定义“能做什么”,是能力契约;抽象类定义“是什么”,是类型归属。如订单继承AbstractOrder(类型归属),同时实现Exportable等接口(正交能力)。语法上接口无状态、支持default方法作辅助逻辑,抽象类可持状态、控流程。选型看是否需多类复用能力、共享状态或正交组合。

面试时被问“接口与抽象类的区别”,关键不是堆砌语法条目,而是让面试官听出你写过真实项目、做过设计权衡。高质量回答要分三层:先立住设计意图,再用语法差异佐证,最后落到具体场景怎么选。
一、一句话锚定核心:不是“能不能”,而是“为什么”
接口回答的是“它能做什么”,是能力契约;抽象类回答的是“它是什么”,是类型归属。比如一个订单对象,它是电商订单(适合继承AbstractOrder),同时它能被导出(实现Exportable)、能被审核(实现Approvable)、能发通知(实现Notifiable)——这些能力互不相干,必须靠接口叠加。
二、语法差异要服务于设计意图,不能孤立背诵
Java 8+之后,接口也能有default和static方法,抽象类也能只含抽象方法。所以别再说“接口不能写实现”——重点在于:
• 接口里的default方法是为向后兼容或提供通用辅助逻辑(如Collection.sort()),不允许访问实例状态,也不该承担主干流程;
• 抽象类里的具体方法可以操作protected字段、调用子类未实现的钩子、控制模板流程(比如支付中的统一验签→调用→回调处理);
• 接口不能有构造器、不能存可变状态,决定了它天然适合解耦;抽象类有构造器、能初始化共享字段,决定了它天然适合复用。
三、选型决策看三个实际问题
遇到新需求,快速判断用哪个,就问自己这三个问题:
- 这个东西将来会不会被多个完全无关的类需要?比如“可重试”“可缓存”“可审计”——选接口
- 这几个类之间有没有共用的状态(如连接池、配置对象、日志器)或高度一致的执行骨架(如统一拦截、统一幂等处理)?——选抽象类
- 是否需要让一个类同时拥有多种正交能力?比如“既是支付渠道,又支持异步回调,还能生成对账单”——必须用接口组合,抽象类做不到
四、举一个你真可能写的例子
做风控规则引擎时:
• 所有规则都要evaluate(context)并返回结果,这是能力契约 → 定义Rule接口;
• 但大部分规则都需要从配置中心加载参数、记录执行耗时、上报指标 → 这些公共逻辑和状态封装进AbstractBaseRule抽象类;
• 某些规则还要求支持灰度开关、依赖外部服务熔断 —— 这些额外能力通过Grayable、CircuitBreakerAware等接口叠加实现。
这样既复用了骨架,又保留了扩展弹性,也方便单元测试(接口易 mock,抽象类可直接继承测试)。


















