接口的default有什么意义?加上default有什么用?

在Java 8中引入了接口中的default方法,这是为了应对随着语言和库的发展,接口需要添加新方法的问题。在Java 8之前,如果在接口中添加了一个新方法,那么所有实现了该接口的类都需要提供这个新方法的实现,否则会编译失败。这在大型项目或广泛应用的库中可能会导致大量的修改工作,甚至破坏向后兼容性。


default方法的意义在于:

  1. 避免破坏现有实现
    • default方法允许在接口中添加新方法的同时,提供一个默认实现,这样就不会强制要求所有实现类都必须重新实现这个方法。
  2. 增强接口功能
    • 接口可以随着时间演进而增强其功能,而不会对现有的实现造成影响。例如,Iterable接口在Java 8中添加了forEach和spliterator方法,这些方法都是default方法。
  3. 提供默认行为
    • default方法可以提供一些常见的默认行为,减少实现类的代码量,使得实现类可以专注于实现其核心功能。
  4. 提高代码复用性
    • 实现类可以选择性地覆盖default方法,或者直接使用接口提供的默认实现,从而提高了代码的复用性和模块化。
  5. 简化API设计
    • 设计者可以在接口中直接提供一些实用的实现,而不需要创建额外的抽象类作为基类来提供这些实现。

然而,使用default方法也需要注意以下几点:

  • 如果两个接口被同一个类实现,而它们都有同名的default方法,那么这个类必须显式地覆盖这个方法,否则将导致编译错误,因为Java虚拟机无法决定使用哪个接口的default方法实现。
  • default方法的引入是为了向前兼容,但是它并不保证向后兼容,即如果一个新版本的接口改变了default方法的实现,那么可能会影响到旧版本的实现类的行为。
  • default方法不应该被过度使用,否则会降低接口的抽象程度,使得接口看起来更像一个抽象类。