Java 8 接口默认方法
面试官问:"JDK 8 为什么要在接口里加默认方法?"
候选人小顾答:"为了让接口可以提供默认实现,这样实现类就不用每个方法都实现了。"
面试官追问:"那如果一个类实现了两个接口,两个接口有同名的默认方法,怎么办?"
小顾说:"会冲突...需要选择一个?"
面试官又问:"如果一个抽象类实现了接口,但没实现默认方法,会发生什么?"
小顾答不上来。
【面试官心理】 这道题测试的是候选人对 Java 多继承冲突处理机制的理解。能完整说出冲突解决规则的候选人,说明真正看过 JDK 8 的新特性文档或源码。
一、为什么需要默认方法 🔴
1.1 JDK 8 之前的问题
1.2 主要用途
用途一:向后兼容
用途二:接口演进
用途三:Lambda 表达式支持
集合框架大量使用默认方法,就是为了支持 Lambda:
二、多继承冲突解决规则 🔴
2.1 规则一:类的方法优先于接口的默认方法
2.2 规则二:父类优先于接口
2.3 规则三:同级别接口冲突必须显式解决
2.4 Diamond 问题
只有当 B 和 C 都覆写了** A 的 method 时,D 才会遇到冲突。**
三、静态默认方法 🔴
静态方法的特点:
- 不能在实现类中被继承
- 不能在默认方法中调用
- 属于接口本身,不属于实现类
四、追问升级
面试官:"为什么 Collection 要加 stream() 和 parallelStream() 作为默认方法?"
答案:向后兼容。如果 stream() 不是默认方法,所有旧的 Collection 实现类都需要添加这个方法的实现。加上默认方法后,所有实现类自动获得 stream() 能力,同时保留旧代码的兼容性。
面试官:"抽象类和接口都有默认方法,怎么选?"
【面试官心理】 能完整说出三条冲突解决规则并用代码演示的候选人,说明对 Java 8 新特性有深入了解。这是 P6+ 的进阶点。