Java 8 - 接口不再是抽象的吗?

6

迄今为止,在Java中,接口不能实现任何方法。根据定义,它们只是一组没有主体的方法签名。

但似乎在Java 8中有所改变。

这是真的吗?“默认方法”是什么?什么是“函数式接口”?有人可以向我解释一下吗?Google上的信息很混乱。


http://www.techempower.com/blog/2013/03/26/everything-about-java-8/ - Ismail Badawi
5
谷歌上的东西相当令人困惑 - 有很多关于Java 8的文章。例如,您阅读过http://docs.oracle.com/javase/tutorial/java/IandI/defaultmethods.html吗? - Jon Skeet
2个回答

4
在Java 8中,接口现在可以有实际实现的默认方法了。这样做是为了帮助那些实现了已更改的接口的用户避免问题,使他们不必更新其所有类。
您可以通过在方法签名中添加default关键字来添加此功能。
参见 Java教程

1
我在回答的时候看到了你的答案弹出,所以我会将教程的默认接口部分直接链接添加进去。 - barry-johnson
@barry-Johnson 谢谢您。 - Brian
谢谢。我读到一个函数式接口是一个具有一个“抽象方法”的接口。直到现在,接口的所有方法都是抽象的。但现在有了“默认方法”,它们不是抽象的。如果是这样,那么接口中任何不是“默认”的方法都被认为是抽象的吗? - Aviv Cohn
@Prog 正确。非“default”方法和非“static”方法本质上是抽象的。因此,如果您想在接口中实现一个方法,可以使用“default”关键字进行升级/增强方法,使用“static”关键字进行辅助方法。这些方法不需要由您的实现类来实现。 - Brian

3

“默认方法”是什么?

默认方法提供了一种机制,使您可以向接口添加实现而不将其变成抽象类。

默认方法的主要用例是在不破坏其他人的代码的情况下添加方法到接口中。然而,它们还允许您通过实现接口来“混合”功能,这是 Java 类型系统的一个非常强大的补充,它过去只允许单行实现。

“函数式接口”是什么?

另一方面,“函数式接口”是告诉编译器您的接口将具有恰好一个方法的方法。作为交换,编译器为定义接口实现提供了更短的语法,从而显着缩短了依赖匿名类的代码。

除了上述两个特性之外,接口还允许您定义静态函数以在所有实现之间共享。与默认实现类似,这添加了一个“第二维度”的继承实现,因为它允许您通过接口实现共享代码。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接