在新的Java 8日期和时间API:Stephen Colebourne的访谈中 , Stephen Colebourne告诉Hartmut Schlosser :“我认为最重要的语言更改不是lambda,而是接口上的静态方法和默认方法。” Colebourne补充说:“添加默认方法消除了使用抽象类的许多原因。” 在阅读本文时,我意识到Colebourne是正确的,并且我当前使用抽象类的许多情况都可以用具有JDK 8默认方法的接口替换。 这在Java世界中非常重要,因为抽象类和接口之间的差异一直是困扰新Java开发人员试图理解差异的问题之一。 在许多方面,在JDK 8中区分两者甚至更加困难。
在线论坛和博客中有许多示例,讨论了Java接口和抽象类之间的区别。 这些包括但不限于JavaWorld的Abstract类和interfaces , StackOverflow的何时必须使用接口代替抽象类? , 接口与抽象类之间的区别 ,Java中的10个抽象类和接口面试问题 ,曾经有用且有用的答案,现在它们中的许多已经过时了,对于那些刚开始使用Java的Java初学者来说,这可能会更加困惑JDK 8的Java经验。
当我在思考JDK 8世界中Java接口和抽象类之间的其余差异时,我决定看看Java教程对此要说些什么。 本教程已更新为反映JDK 8,并且抽象方法和类具有称为“与接口相比的抽象类”的部分,该部分已进行了更新以合并JDK8。本节指出了JDK 8接口与抽象类的异同。 。 它强调的区别是数据成员和方法的可访问性:抽象类允许非静态和非最终字段,并允许方法是公共的,私有的或受保护的,而接口的字段本质上是公共的,静态的和最终的,以及所有接口方法本质上是公共的。
Java教程继续列出了何时应该考虑抽象类以及何时应该考虑接口的项目符号。 毫不奇怪,它们源自前面提到的差异,并且主要与是否需要将字段和方法设置为私有,受保护,非静态或最终(喜欢抽象类)或是否需要专注于键入的能力有关无需考虑实现(偏好接口)。
因为Java允许一个类实现多个接口但仅扩展一个类,所以当特定实现需要与多种类型关联时,可以认为该接口是有利的。 由于JDK 8的默认方法,这些接口甚至可以为实现提供默认行为。
一个自然的问题可能是:“ Java如何处理实现两个接口的类,这两个接口都描述具有相同签名的默认方法?” 答案是这是编译错误。 这在下一个屏幕快照中显示,该快照显示NetBeans 8在我的类实现两个接口时均报告该错误,每个接口定义了具有相同签名[ String speak()
]的默认方法。
如上面的屏幕快照所示,显示了一个编译器错误,指出“类...从类型…和…继承…的不相关默认值”(其中,类名,默认方法名和两个接口名是消息中指定的名称) )。 Peter Verhas撰写了一篇详细的文章(“ Java 8默认方法:可以做什么和不能做什么? ”),探讨了与带有相同方法的具有默认方法名称的多重实现接口相关的一些极端情况(陷阱)。
结论
可以说,JDK 8带来了抽象类相对于接口的最大优势。 这样做的含义是,当今使用的大量抽象类很可能会被具有默认方法的接口所取代,而许多将来将成为抽象类的未来构造现在将成为具有默认方法的接口。
翻译自: https://www.javacodegeeks.com/2014/04/abstract-class-versus-interface-in-the-jdk-8-era.html