说清接口 `default` 方法如何解决单继承与代码复用问题
介绍接口在 JDK 1.8 的演进。通过 default 关键字,接口可提供方法体的默认实现,解决以往只能靠抽象类复用代码导致的单继承高成本问题。它不破坏已有实现类,主要用于接口演进(如 List.sort),同时可与 static 方法配合简化开发。它是一个非抽象方法,故可以自由添加到函数式接口中。
诊断题
List 接口在 JDK 1.8 能直接新增 sort 方法而不破坏以前的 ArrayList 实现?default 方法和抽象类的普通方法在继承机制上有何差异?答案骨架
我能解释接口默认方法的演进与机制
- 概念上,JDK 1.8 允许接口用
default提供非抽象方法体 - 解决了接口一旦发布就难以修补或扩展的痛点
- 机制上,它避免了单继承限制,编译器将其视为非抽象方法
- 边界上,默认方法不能访问实例变量,且在多接口冲突时需实现类显式覆盖。
边界追问
default 方法,编译器会怎么处理?会直接报错吗?边界答案
default 方法。在重写的方法体内,可以通过 接口名.super.方法名() 显式指定调用哪个接口的默认实现。记忆锚点
default 带身不破类;多接口若冲突,覆写指明谁对位。衍生拓展
- Java 9 接口私有方法进一步复用代码 - 菱形继承中默认方法的冲突解决策略 -
default方法在 Stream API 和 Collection 源码中的运用
落地场景
老接口增加默认方法 java interface IFormula { double calculate(int a); default double sqrt(int a) { return Math.sqrt(a); } }