Java 后端面试题库 / 全部题解免费阅读理解原理,有条理地回答

什么时候更适合用抽象类,而不是只用接口?

查看完整题解

参考回答

直接回答

当一族对象确实共享实例状态、初始化约束和稳定执行骨架,同时只希望子类补充少数步骤时,抽象类通常更合适。若只是定义跨类型的能力协议,接口常更灵活。抽象类与接口可以配合使用,不必把它们设计成只能二选一。

讲清原理

例如一族导出任务都要记录任务名称,并按相同顺序执行检查、生成结果、收尾。基类可以维护公共状态和模板方法,子类只实现变化的部分。

不过,继承会把子类绑定到基类契约,基类的变化也可能影响全部子类。若差异主要来自可以独立替换的协作者,组合与策略接口往往比继续叠继承层次更容易维护。

例子与易错点

abstract class Task {
    private final String name;
    Task(String name) { this.name = name; }
    final void run() { System.out.println(name + ":" + execute()); }
    protected abstract String execute();
}
class ExportTask extends Task {
    ExportTask() { super("导出"); }
    protected String execute() { return "完成"; }
}
new ExportTask().run(); // 导出:完成

共享的是状态与执行骨架,不只是方法名。不要为了一点代码复用就让毫无替代关系的类型继承同一基类,也别在基类中不断堆积只服务于个别子类的分支。

相关题:第 9 题、第 19 题、第 32 题。

这道题,你掌握得怎么样?

掌握程度由你主动标记,阅读和收藏不会自动改变状态。