为何使用默认方法

简单的答案是,它允许你在不破坏现有实现的情况下发展现有接口。

例如,你有 20 年前发布的 Swim 接口。

public interface Swim {
    void backStroke();
}

我们做得很好,我们的界面很受欢迎,世界各地都有很多实现,你无法控制它们的源代码。

public class FooSwimmer implements Swim {
    public void backStroke() {
         System.out.println("Do backstroke");
    }
}

20 年后,你决定在界面中添加新功能,但看起来我们的界面被冻结,因为它会破坏现有的实现。

幸运的是 Java 8 引入了名为 Default method 的全新功能

我们现在可以为 Swim 接口添加新方法。

public interface Swim {
    void backStroke();
    default void sideStroke() {
        System.out.println("Default sidestroke implementation. Can be overridden");
    }
}

现在,我们接口的所有现有实现仍然可以工作。但最重要的是,他们可以在自己的时间内实施新增的方法。

这种变化的最大原因之一,也是其最大的用途之一,就是 Java Collections 框架。Oracle 无法在不破坏实现 Iterable 的所有现有代码的情况下将 foreach 方法添加到现有的 Iterable 接口。通过添加默认方法,现有的 Iterable 实现将继承默认实现。