阐述 default 关键字如何打破传统接口设计约束
JDK 1.8 允许使用 `default` 关键字在接口中提供方法的默认实现。在 1.8 前,接口仅作方法定义,公共逻辑需在抽象类中实现。此机制解决了接口演进问题(如向旧接口添加新方法而不破坏实现类)。核心机制为在方法签名前加 `default` 并提供方法体。常见误区是将默认方法与抽象类混为一谈,但接口仍不支持实例状态字段。
为什么 JDK 1.8 要引入 default 关键字?如果在已有大量实现类的 Collection 接口中新增一个带 default 的方法,原有的实现类会编译报错吗?
我能解释 default 方法的设计动机与影响:1) 1.8前接口只能定义抽象方法,公共逻辑需靠抽象类下沉;2) default 关键字允许在接口内部编写默认实现,方便核心接口向后兼容地引入新功能;3) 新增 default 方法不会导致已有实现类编译报错,它们可直接继承默认逻辑,但如果子类重写则需自己提供实现。
如果一个类实现了两个不同的接口,而这两个接口中又同时包含了完全同名同参数的 default 方法,此时 Java 编译器会怎么处理?会触发什么编译错误?
定义 `public interface IFormula { double calculate(int a); default double sqrt(int a) { return Math.sqrt(a); } }`。匿名内部类实现 `calculate` 后,可直接调用 `formula.sqrt(2)` 求开方,无需在每个实现类里重复编写求平方根逻辑。