接口定义“能做什么”,强调行为契约;抽象类定义“是什么”,体现类族共性。接口支持多实现、无构造器、字段为常量;抽象类仅单继承、可含构造器与普通成员变量。

接口和抽象类都是 Java 中实现引用类型抽象化的关键机制,但它们解决的问题不同、适用的场景也不同。
设计意图:规范 vs 共性
接口本质是行为契约,回答“能做什么”——比如 Comparable 规定对象可比较,Runnable 表明对象可执行。它不关心你是谁,只约束你必须提供哪些能力。
抽象类则更像一个模板,回答“是什么”——比如 Animal 抽象类可以定义 name 属性、sleep() 具体方法和 makeSound() 抽象方法,表达的是子类共有的身份与基础行为。
简单说:接口定义“有没有这个功能”,抽象类定义“属于哪一类东西”。
语法与结构限制
接口中:
- 所有方法默认 public abstract(Java 8+ 可加 default 或 static 方法)
- 所有字段自动是 public static final 常量,不能声明普通变量
- 没有构造器,不能保存实例状态
- 不能有 private 或 protected 方法(除 Java 9+ 的私有默认方法外)
抽象类中:
- 可以有 abstract 方法,也可以有完整实现的普通方法
- 可声明任意访问修饰符的字段(private、protected、public)
- 允许定义构造器,用于子类初始化共享逻辑
- 支持非静态成员、普通方法、甚至 main 方法
继承关系与组合能力
Java 是单继承语言,一个类只能 extends 一个抽象类,但可以 implements 多个接口。
这意味着:
- 如果多个类在语义上属于同一父类体系(如 Dog、Cat 都是 Animal),优先用抽象类统一基础
- 如果不同类需要共享某种能力(如 File、String、URL 都要支持序列化),就用接口(如 Serializable)
- 实际开发中常组合使用:类继承抽象类获得共性,再实现若干接口扩展能力
演进与兼容性考虑
往抽象类里加一个非抽象方法,子类无需改动就能用;往接口里加新抽象方法,所有实现类都得补实现——否则编译失败。
所以:
- 接口新增方法时,优先考虑用 default 方法提供向后兼容的默认行为
- 抽象类更适合长期稳定、有明确继承层级的设计;接口更适合定义开放、可插拔的能力契约
- 当不确定未来是否需要添加默认实现或状态管理时,从接口起步更灵活











