我知道界面提供了完全抽象,因为它不具备抽象类等具体方法。但是从java 8开始,接口可以使用default关键字具有具体方法,实现接口的类可以覆盖这些具体方法。 那么,界面真的提供完全抽象吗?
答案 0 :(得分:2)
通过不编写默认方法,您仍然可以使接口提供完全抽象。
稍后,可能需要向此接口添加新功能并确保二进制兼容性。您将使用默认方法作为抽象和灵活性之间的权衡。
实际上,精心设计的默认方法不会带来许多特定的(依赖于实现的)事物。看看java.util.Comparator
。我不会说像thenComparing
,naturalOrder
这样的方法会破坏Java 1.2版本引入的抽象级别。
答案 1 :(得分:1)
有没有,有了Java8的介绍,你基本上可以在接口中使用具体的方法。
像这样。
public interface IHelloWorld {
public default void print() {
System.out.println("Hello World");
}
}
现在你可以实现一个实现这个接口的类或一个匿名类,并使用print(),就像你在一个抽象类中编写这个方法一样。
重要提示:
首先,您无法在界面中创建直接变量。你可以通过引入getter和setter来克服这个问题,但那将是不好的做法。
此外,您无法将此方法设置为最终。
不能这样做:
public final default void print() {
System.out.println("Hello World");
}
这似乎是一个小问题,但在现实世界中,这可能是一个问题。有时你真的需要一个最终的方法来完全不被孩子改变。
在使用Java8的结论中,你也可以在接口中实现默认值,但是你不能将它们设置为final,而且更重要的是你不能创建类变量,因为它显然不是一个类。