Java为什么要使用默认方法?

示例

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

例如,你有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实现将继承默认实现。