Java 8允许在称为default methods的接口中默认实现方法。

我在什么时候使用那种接口默认方法,而不是抽象类(带有抽象方法)之间感到困惑。

那么什么时候应该使用默认方法的接口,什么时候应该使用抽象类(带有抽象方法)?抽象类在这种情况下仍然有用吗?


当前回答

什么时候应该使用缺省方法的接口,什么时候应该使用 抽象类被使用?

向后兼容性: 想象一下,你的接口是由数百个类实现的,修改这个接口将迫使所有用户实现新添加的方法,即使它对于实现你的接口的许多其他类来说可能不是必需的。另外,它允许你的接口成为一个功能接口

事实与限制:

1-只能在接口中声明,而不能在类或 抽象类。

2 .必须提供一个主体

它不像接口中使用的其他常规方法那样被认为是抽象的。

其他回答

关于你对…

那么什么时候应该使用默认方法的接口,什么时候应该使用抽象类?抽象类在这种情况下仍然有用吗?

Java文档提供了完美的答案。

抽象类与接口的比较:

Abstract classes are similar to interfaces. You cannot instantiate them, and they may contain a mix of methods declared with or without an implementation. However, with abstract classes, you can declare fields that are not static and final, and define public, protected, and private concrete methods. With interfaces, all fields are automatically public, static, and final, and all methods that you declare or define (as default methods) are public. In addition, you can extend only one class, whether or not it is abstract, whereas you can implement any number of interfaces.

它们各自的用例已经在下面的SE帖子中解释了:

接口和抽象类的区别是什么?

抽象类在这种情况下仍然有用吗?

是的。它们仍然有用。它们可以包含非静态的、非最终的方法和属性(受保护,除了公共之外还有私有),这即使是Java-8接口也不可能实现。

抽象类比默认方法实现(如私有状态)要多得多,但从Java 8开始,无论何时您可以选择其中任何一种,都应该选择防御器(也就是私有状态)。默认)方法。

默认方法的限制是它只能通过调用其他接口方法来实现,而不能引用特定实现的状态。所以主要的用例是高级和方便的方法。

这个新特性的好处在于,以前您必须使用抽象类来实现方便的方法,从而将实现者限制为单一继承,现在您可以拥有一个真正干净的设计,只需要接口,并且强制程序员进行最少的实现工作。

向Java 8引入默认方法的最初动机是希望在不破坏任何现有实现的情况下,使用面向lambda的方法扩展集合框架接口。虽然这与公共图书馆的作者更相关,但您可能会发现相同的特性在您的项目中也很有用。您有一个集中的地方可以添加新的便利,而不必依赖于类型层次结构的其余部分。

什么时候应该使用缺省方法的接口,什么时候应该使用 抽象类被使用?

向后兼容性: 想象一下,你的接口是由数百个类实现的,修改这个接口将迫使所有用户实现新添加的方法,即使它对于实现你的接口的许多其他类来说可能不是必需的。另外,它允许你的接口成为一个功能接口

事实与限制:

1-只能在接口中声明,而不能在类或 抽象类。

2 .必须提供一个主体

它不像接口中使用的其他常规方法那样被认为是抽象的。

如本文所述,

Java 8中的抽象类与接口

After introducing Default Method, it seems that interfaces and abstract classes are same. However, they are still different concept in Java 8. Abstract class can define constructor. They are more structured and can have a state associated with them. While in contrast, default method can be implemented only in the terms of invoking other interface methods, with no reference to a particular implementation's state. Hence, both use for different purposes and choosing between two really depends on the scenario context.

请首先考虑开/闭原则。接口中的默认方法确实违反了它。这是Java中的一个不好的特性。它助长了糟糕的设计、糟糕的架构和低软件质量。我建议完全避免使用默认方法。

问自己几个问题: 为什么不能把方法放到抽象类中?那么您是否需要多个抽象类呢?然后想想你的类负责什么。您确定要放入单个类中的所有方法都实现了相同的目的吗?可能你会区分几个目的,然后将你的类分成几个类,每个目的有自己的类。