默认方法不能替代抽象类,因为抽象类可以(并且经常)具有字段。接口只能包含行为而不能包含状态,这一点在将来不太可能改变,因为Java中状态的多重继承被认为是错误的(正确的或错误的)。
它们还可以有final
方法,这是您不能用default
方法模仿的另一个东西。
如果有的话,带有默认方法的接口类似于traits,而不是抽象类,但这种匹配并不完美。使用接口作为特性是一件必须非常谨慎的事情,并且知道它们带来的限制。(例如,任何实现类都可以重写default
方法,从而可能破坏该特性。)
这里有更多关于这个的内容。
问题内容: Java 8接口默认方法与抽象类中的非抽象方法-两者之间是否有任何区别(除了iface-类,可见性等不同) 默认方法不是Java的后退一步,是否违反Java多年来宣传的本质? 问题答案: 如果抽象子类的具体子类被super()覆盖,则抽象类中的非抽象方法将被调用。因此,存在多种可能性。如果不重写method,则将执行超类方法。如果我们在具体的子类方法中使用super(),则将执行被超类
Java 8接口默认方法与抽象类中的非抽象方法--两者之间有什么区别吗(除了iface-class、可见性等的区别之外) 默认方法是不是在Java中倒退了一步,意味着它违背了Java多年来宣传的本质?!
我试图给出一个完整的答案: "为什么/何时使用抽象类而不是接口。" 并寻找以下方面的验证/建议。 对此的一个答案是, 在具体类来定义特定类型之前,抽象类通常位于继承层次结构中接口的正下方(就像Java API中的许多示例一样),实现并固定接口定义的结构的一些公共方面。 使用抽象类的另一个很好的理由是类型之间有一个清晰的逻辑层次结构。抽象类具有组织层次结构的作用,同时通过作为抽象类而不是具体类,迫使
主要内容:1 Java8 默认方法的介绍,2 Java8 默认方法的案例1 Java8 默认方法的介绍 Java提供了一种在接口内部创建默认方法的功能。在接口内部定义并带有默认标记的方法称为默认方法。这些方法是非抽象方法。 2 Java8 默认方法的案例 在下面的示例中,Sayable是一个功能接口,其中包含默认值和抽象方法。默认方法的概念用于定义具有默认实现的方法。您还可以覆盖默认方法,以为该方法提供更具体的实现。 输出结果为:
我想给出一个完整的答案: “为什么/何时使用抽象类而不是接口。” 并寻求对以下方面的验证/建议。 “一个原因是:接口方法都是公共的,字段成员都是常量(final和public)。您可能需要限制方法的访问权限和/或使它们在非常量状态下操作。 另一个是:子代类可以通过super调用抽象类方法,而它不能对默认接口方法调用抽象类方法。此外,接口没有可由后代调用的构造函数。 其余的原因与上面的pre-Jav
问题内容: 拥有具有默认方法的接口的动态代理,如何调用默认方法?通过使用类似的方法,您可以得到名为的代理调用处理程序(这在某种程度上是正确的,因为您没有为此接口实现的类)。 我有一个使用ASM来创建实现接口的类并将此类调用委派给此类实例的解决方法。但这不是一个好的解决方案,特别是如果默认方法调用其他接口方法(您将获得委托人乒乓球)。JLS对此问题出人意料地保持沉默… 这里是一个小代码示例: 问题答