JDK8 中抽象类和接口的区别

英文原文:https://www.javacodegeeks.com/2014/04/abstract-class-versus-interface-in-the-jdk-8-era.html
jdk1.7与jdk1.8对比 https://blog.csdn.net/qiuchaoxi/article/details/79869817
Jdk1.7 与 jdk1.8的区别,最新的特征有哪些(美团,360,京东面试题目):https://www.cnblogs.com/aspirant/p/8617201.html
jdk 1.8 和1.7有什么区别 https://zhidao.baidu.com/question/1993479883092451387.html

Java抽象类与接口的区别:http://www.importnew.com/12399.html
java提高篇之抽象类与接口:http://www.importnew.com/19924.html
深入理解Java的接口和抽象类:http://www.importnew.com/18780.html

JDK 8 中抽象类和接口的区别

在新的Java 8日期和时间API: Stephen Colebourne的采访中,Stephen Colebourne告诉Hartmut Schlosser,“我认为最重要的语言变化不是lambdas表达式,而是static和default声明的接口方法。Colebourne补充说,“default方法的增加消除了许多使用抽象类的原因。当我读到这篇文章时,我意识到Colebourne是对的,我现在使用抽象类的很多情况都可以用JDK 8接口中的默认方法来代替。这在Java世界中非常重要,因为抽象类和接口之间的差异一直是困扰新Java开发人员试图理解的问题之一。在许多方面,在JDK 8中区分这两者更加困难。

有很多在线论坛和博客讨论Java中接口和抽象类之间的区别的例子。这些包括,但不限于,《JavaWorld‘s Abstract classes vs. interfaces》,《StackOverflow‘s When do I have to use interfaces instead of abstract classes?》,《 Difference Between Interface and Abstract Class》,《10 Abstract Class and Interface Interview Questions Answers in Java》。这些曾经是有用和有益的,现在很多都是过时,对初接触JDK 8的java开发者来说,还可能会让他们更加困惑。

当我思考JDK 8中Java接口和抽象类之间的其他区别时,我决定看看Java教程(官方)对此有什么要说的。本教程已经更新,以反映JDK 8,抽象方法和类有一个称为“抽象类与接口的比较”的部分,这个部分已经更新,以合并JDK 8。本节指出JDK 8接口与抽象类的异同。它强调的区别是数据成员和方法的可访问性:抽象类允许非static和非final字段,允许方法是public、private或protected,而接口的字段类型本质上是public的、static的和final的,所有接口方法本质上都是公共的。

The Java Tutorial goes on to list bullets for when an abstract class should be considered and for when an interface should be considered。bullets只有子弹的意思,这么译完全不对,还有considered可译为“考虑”或“指定”,这句不知如何翻译,望各位读者指教。不出意外的是,这些差异来自于前面提到的差异,主要与您是否需要字段和方法是私有的、受保护的、非静态的、或者不是最终的(青睐抽象类)有关,或者您是否需要在不考虑实现的情况下专注于键入(青睐接口)。
因为Java允许一个类实现多个接口,但只扩展一个类,所以当一个特定的实现需要与多个类型相关联时,这个接口可能被认为是有利的。由于JDK 8的默认方法,这些接口甚至可以为实现提供默认行为。

一个自然的问题可能是,“Java如何处理实现两个接口的类,这两个接口都描述了具有相同签名的默认方法?”答案是这是一个编译错误。在下一个屏幕快照中可以看到,当我的类实现两个接口时,NetBeans 8报告了错误,每个接口都定义了具有相同签名的默认方法[String speak()]。

JDK8 中抽象类和接口的区别_第1张图片

正如上面的屏幕快照所示,显示了一个编译错误,:“class … inherits unrelated defaults for … from types … and …”(其中类名、默认方法名和两个接口名是消息中指定的)。Peter Verhas写了一篇详细的文章(“Java 8默认方法:能做什么和不能做什么?讨论了一些与使用相同签名的默认方法实现多接口相关的问题。

结论
JDK 8带来了抽象类相对于接口的最大优势。这意味着,现在使用的大量抽象类可能会被具有默认方法的接口所取代,而大量原本是抽象类的未来构造现在将成为具有默认方法的接口。

你可能感兴趣的:(Java)