接口解决“能做什么”,如flyable、serializable;抽象类解决“是什么”,如animal、shape;前者无状态、多实现、不表继承,后者可存状态、有构造器、体现is-a关系。

接口和抽象类不是“选哪个更好”,而是“解决什么问题”。面试官真正想听的,不是背诵语法条目,而是你能不能从设计意图出发,讲清楚为什么这里用接口、那里用抽象类。
核心定位一句话说清
接口回答“能做什么”——比如Flyable、Serializable、Comparable,不关心你是鸟还是无人机,只要能飞、能序列化、能比较,就打上这个标签;
抽象类回答“是什么”——比如Animal、Shape、AbstractList,它代表一类对象的共同身份和基础骨架,子类天然属于它。
关键区别不在语法,在设计逻辑
很多候选人卡在“接口能写default方法了,那和抽象类还有啥区别?”——其实default方法只是补足能力,不改变本质:
– 接口仍不能存状态(所有字段自动是public static final);
– 接口仍没有构造器,无法初始化实例相关数据;
– 接口仍不表达继承关系,实现多个接口不代表它们有共同父源。
而抽象类:有构造方法、可定义protected成员变量、能封装初始化逻辑、天然体现“is-a”层级。这些是接口永远做不到的。
你接手一个需求时,是不是经常这样:"改一个小字段 → 结果把不相关的代码也改了"、"需求说得很模糊 → 做着做着发现跑偏了"、"数据库加个字段 → 上线才发现漏了数据兼容"、"做了个新功能 → 一个月后自己都忘了当时怎么设计的"、"写到一半被中断 → 再回来不知道从哪继续";这个 Skill 就是专门解决这些问题的。 它会自动探测你的项目环境(JDK、Spring Boot、ORM、数据库、前端框架),记在
选型时盯住三个问题
写代码前快速自问:
- 要不要为子类提供可复用的具体实现?→ 选抽象类
- 多个不相关的类是否需要统一行为?→ 选接口(如
Runnable既可用于线程,也可用于定时任务) - 是否需要被多个类型同时具备该能力?→ 必须选接口(Java不支持多继承)
高频面试追问怎么答
Q:抽象类可以实现接口吗?
可以。常见于模板类既要复用逻辑,又要满足某项规范,比如AbstractCollection实现了Collection接口。
Q:一个类能既继承抽象类又实现接口吗?
完全可以。这是标准做法:class MyList extends AbstractList<string> implements Serializable, Cloneable</string>。
Q:JDK8之后接口有了default方法,是不是可以替代抽象类?
不能。default方法不能访问实例变量,不能调用构造器,也不能重载或覆盖父类同名方法——它只是让接口更灵活,不是让接口变模板。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










