Java 8 默认方法与抽象类中的非抽象方法

Java 8接口默认方法与抽象类中的非抽象方法 - 两者之间是否有任何差异(除了iface的差异 - 类,可见性等)

默认方法在Java中不是退后一步吗,这意味着它违背了Java多年来宣传的本质吗?!


答案 1

如果被重写,则抽象类中的非抽象方法将在具体子类调用 super() 时调用。所以有多种可能性。如果未重写方法,则将执行超类方法。如果我们在具体的子类方法中使用super(),那么将执行带有超类方法的重写方法。

其中作为Java 8接口的默认方法完全不同。它为开发人员提供了在实现类中实现方法的选择。如果函数未实现,则仅执行默认方法。

可能的用例 :

JDK 库中这个新功能最重要的用例是可以在不破坏现有实现器的情况下扩展现有接口:向接口添加新的抽象方法将需要所有实现类来实现该新方法。(来源)


答案 2

要记住的重要一点是,默认方法无权访问状态,只能访问行为。它实际上是定义合理,默认行为的好地方。

想象一下,你有一个界面:

public interface Plant {
    enum Pace { FAST, SLOW; }

    void grow(Pace pace);
    void growFast();
    void growSlow();
}

提供默认行为似乎是合理的:

default void growFast() { grow(Pace.FAST); }
default void growSlow() { grow(Pace.SLOW); }

这是一个简单的示例,但显示了默认方法如何提供帮助。在这种情况下,方式或行为是接口协定的一部分,因此在接口级别定义它们的行为是有意义的。growSlowgrowFast

但是,该界面没有假设如何实现“种植植物”的动作。这可以在抽象类中定义。


推荐