接口定义“能做什么”,强调行为契约;抽象类定义“是什么”,强调类型共性。接口无状态、多实现;抽象类可含状态与构造器、单继承。优先接口用于跨类型行为与解耦,优先抽象类用于共享逻辑与状态约束。
接口和抽象类在 Java 中都用于抽象建模,但设计意图、语法能力与使用场景有本质差异。选错会影响扩展性、复用性和团队协作效率。
接口定义“能做什么”,强调行为契约(like-a关系),比如 Flyable、Serial;它不关心实现者是谁,只要求具备该能力。抽象类定义“是什么”,强调类型共性(is-a关系),比如
izableAnimal、InputStream;它提供基础结构,子类天然继承其身份与部分实现。
抽象类更“像类”:可含构造器、普通字段(实例变量)、私有方法、静态块、初始化块、protected 方法等;支持完整的访问控制。接口更“像协议”:所有字段自动是 public static final 常量;所有普通方法默认 public abstract;JDK 8+ 允许 default(实例方法)和 static(工具方法),但不能有实例状态或构造逻辑。
优先用接口当系统需要:
Comparable 被 String、Date、自定义类共同实现)UserRepository 接口,内存/MySQL/Redis 实现各自版本)优先用抽象类当系统需要:
AbstractList 封装了 size()、isEmpty() 等通用实现)protected String id;)两者不互斥——常见做法是抽象类实现核心接口,既保证行为契约,又提供可复用骨架。