简单的答案是,它允许您在不破坏现有实现的情况下发展现有接口。
例如,你有20年前发布的 Swim 接口。
public interface Swim { void backStroke(); }
我们做得很好,我们的接口非常流行,全世界有很多实现,您无法控制他们的源代码。
public class FooSwimmer implements Swim { public void backStroke() { System.out.println("Do backstroke"); } }
20年后,您已决定向该接口添加新功能,但由于我们的接口将破坏现有的实现,因此它似乎已冻结。
幸运的是,Java 8引入了名为Default方法的全新功能。
现在,我们可以向Swim接口添加新方法。
public interface Swim { void backStroke(); default void sideStroke() { System.out.println("Default sidestroke implementation. Can be overridden"); } }
现在,我们接口的所有现有实现仍然可以使用。但最重要的是,他们可以在自己的时间内实现新添加的方法。
这一变化的最大原因之一,也是它最大的用途之一,是在Java集合框架中。Oracle无法将foreach方法添加到现有的Iterable接口,而不中断实现Iterable的所有现有代码。通过添加默认方法,现有的Iterable实现将继承默认实现。