题目重点:比较抽象类与接口,解释默认方法、构造与单继承限制,给出选择原则。
题意与假设
这道练习题保留了面经中值得训练的核心约束,并将需要澄清的条件单独列出。现场拿到变体时,先和面试官确认这些条件。
- 按现代 Java 语义讨论;接口可以有默认、静态与私有方法,不沿用早期版本结论。
解题路线
- 接口表达调用方需要的能力,类可实现多个接口;抽象类更适合一族对象共享受保护状态、构造约束或模板流程。
- 抽象类不能直接实例化,但构造器由子类构造链调用。接口没有实例构造器,字段是常量而非每个对象独立的可变状态。
- 默认方法可平滑扩展接口,但冲突必须按语言规则显式解决;它不能替代任意复杂的共享状态管理。
- 先画依赖方向再选择:跨支付类型的 charge 能力用接口;一族内部一致的连接生命周期才考虑抽象基类。
手动走一遍
Storage 接口定义 read/write;MemoryStorage 与 RemoteStorage 实现。若二者不共享生命周期,不为它们硬造一个状态很多的 BaseStorage。抽象 ImportJob 的 final run 调用 validate/parse/save,可固定流程,让子类只实现明确扩展点。
规模与取舍
类层次越深,初始化与行为推理成本越高;这里比较的是设计约束而非某种操作的时间上界。
易错点与追问
容易失分的边界
- 说接口绝对不能实现方法。
- 通过 protected 共享大量可变状态,导致子类互相影响。
继续深挖
- 两个接口默认方法冲突如何处理?
- 什么情况下把模板方法改为组合的策略对象?
