接口与抽象类怎样选择?
查看完整题解
参考回答
直接回答
接口主要定义可由不同类型实现的能力或协议,一个类能实现多个接口;抽象类适合共享实例状态、构造约束及一部分实现,一个类只能直接继承一个类。Java 21 的接口还能有 default、static、private 方法,因此“接口只能声明抽象方法”已经过时。
讲清原理
接口字段是 public static final,不是每个实现对象各有一份的普通实例字段;接口也没有构造器。抽象类则可有实例字段、构造器和不同访问级别的具体方法,并能在构造期间建立必要状态。
选型先问:调用方需要一个协议,还是一族对象确实共享状态和初始化规则?协议常用接口,共享骨架常用抽象类,二者可以配合,而不是互相排斥。
例子与易错点
| 需求 | 常见选择 |
|---|---|
| 多种存储都支持 save | Repository 接口 |
| 同族任务共享编号和执行模板 | 抽象任务基类 |
| 一个类同时支持排序和关闭 | 实现多个接口 |
不要为了共享两行工具代码就引入继承,也别因为接口有 default 方法,就把大量可变业务状态搬进接口。抽象类同样不应塞入与这族对象无关的通用职责。
相关题:第 20 题、第 21 题、第 30 题、第 45 题。
这道题,你掌握得怎么样?
掌握程度由你主动标记,阅读和收藏不会自动改变状态。