接口与默认的方法VS在Java抽象类8

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了接口与默认的方法VS在Java抽象类8相关的知识,希望对你有一定的参考价值。

从Java 8允许的接口称为Default Methods方法的默认实现,似乎有之间时,我会用一个abstract class混乱。

所以,当应该用接口可以使用默认的方法什么时候应该抽象类中使用?是抽象类仍然在该方案中有用吗?

答案

还有很多更抽象类比默认的方法实现(如私有状态),但与Java 8,只要你有任一的选择,你应该在界面中后卫(亦称default)方法去。

缺省方法的限制是它只能在调用其它接口方法的条款来实现,没有提到具体实现的状态。所以主要用例是更高层次的和方便的方法。

有关这一新功能的好处是,当你被迫使用抽象类的简便方法,从而制约了实现者单继承之前,现在你可以有一个非常干净的设计仅仅是接口和最小执行努力迫使程序员

最初的动机引进default方法的Java 8是面向拉姆达的方法集合框架接口扩展而不会破坏任何现有实现的愿望。虽然这是更符合公共图书馆的作者,你可能会发现在你的项目相同的特征也是有用的。你已经有了一个集中的地方,增加新的方便,你不必依靠类型层次的其余部分的外观。

另一答案

何时应该使用接口使用默认的方法什么时候应该抽象类中使用?

向后兼容性:试想一下,你的界面是由几百个类来实现,修改界面将迫使所有用户实现新添加的方法,尽管这可能是许多其他类实现你的接口不是必需的,再加上它可以让你的界面是一个功能接口

事实与限制:

1-可以仅在接口内,而不是一类或抽象类中声明。

2-必须提供一个机构

3-它不假定为抽象作为在界面中使用的其它常规方法。

另一答案

在Java 8中,界面看起来像一个抽象类,虽然他们可能有一些差别,例如:

1)抽象类的类,因此它们不限于在Java中例如接口的其他限制抽象类可以有状态,但你不能在Java接口的状态。

2)用默认的方法和抽象类,接口之间的另一个语义区别是,你可以定义构造一个抽象类里面,但你不能定义里面的Java接口的构造

另一答案

在Java接口的默认方法是提供虚拟实现,从而节省了任何实现的类接口的声明,从所有的抽象方法,即使他们想处理只有一个的痛苦功能的使用等等。在界面的默认方法是这样的方式多为适配器类的概念取代。

然而,在抽象类中的方法都应该赋予一个有意义的实现,其如果需要覆盖一个共同的功能任何子类应该只重写。

另一答案

在其他的答案所提到的,为了提供在集合框架向后兼容性加入到添加实施的接口的能力。我认为,提供向后兼容性可能是添加实施的接口的好理由。

否则,如果添加实施的接口,你破坏了为什么摆在首位添加接口的根本规律。 Java是一种单继承的语言,不像C ++允许多重继承。接口提供随附支持多重继承,而不引入附带多重继承问题的语言打字的好处。

更具体地讲,Java的只允许一个实现的单继承,但它允许的接口多重继承。例如,下面是有效的Java代码:

class MyObject extends String implements Runnable, Comparable { ... }

MyObject继承只有一个实现,但它继承了三份合同。

对Java实现的多重继承通过,因为执行的多重继承自带的棘手问题,这是这个答案范围之外的主机。添加接口,允许合同(又名接口)不执行多重继承的问题的多重继承。

为了支持我的观点,这里是由肯·阿诺德和詹姆斯·高斯林从书Java编程语言,第4版报价:

单继承排除一些有用的,正确的设计。多重继承的问题,从实现的多重继承产生的,但在许多情况下,多重继承来继承一些抽象的合同,也许一个具体的实现。提供了一种手段来继承一个抽象的合同没有继承的实现允许多重继承的,而不实现多继承的问题,打字好处。抽象合同的继承称为接口继承。 Java编程语言允许你来声明interface类型支持接口继承

另一答案

请首先想到的开启/关闭的原则。在接口的默认方法都违反了。这是Java中的不良特征。它鼓励设计不好,不好的架构,低质量的软件。我建议完全避免使用默认的方法。

问自己几个问题:为什么不把你方法,抽象类?你需要再超过一个抽象类?后来想想,你是什么类负责。你确定所有的方法你要投入到单个类真正达到同样的目的?可能你会区分多种用途,然后将你的类分成几类,每一个宗旨自己的类。

另一答案

有一些技术上的差异。抽象类还可以做更多的比较与Java 8个接口:

  1. 抽象类可以有一个构造函数。
  2. 抽象类更有条理,可容纳的状态。

从概念上讲,的后卫的方法的主要目的是在Java中8引入新的特征(如λ-函数)之后的向后兼容性。

另一答案

这在此被article描述。想想的集合forEach

List<?> list = …
list.forEach(…);

在foreach不java.util.List也不java.util.Collection接口中声明呢。一个显而易见的解决办法是只需添加新的方法,以现有的接口,并提供在有需要的JDK的实施。然而,一旦公布,这是不可能的方法添加到界面不破坏已有的实现。

该默认方法带来的好处是,现在它可以将新的默认方法添加到界面,并没有打破的实现。

另一答案

正如在文章this描述

抽象类与在Java接口8

引入默认方法后,似乎接口和抽象类是一样的。然而,他们仍然在Java中8个不同的概念。

抽象类可以定义构造函数。他们更结构化的,可以有与它们相关联的状态。而相比之下,默认的方法只能调用其他的接口方法,没有提到具体实现的状态的条件来实现。因此,这两种不同用途和两者之间的选择真的取决于具体的方案内容。

另一答案

这两个是完全不同的:

默认的方法是在不改变其状态添加外部功能,现有的类。

和抽象类是正常类型继承的,它们是旨在被延长正常的类。

另一答案

每当我们有抽象类和接口之间的选择,我们应该总是(几乎)喜欢默认的(也称为后卫或虚拟分机)的方法。

  1. 默认方法已经杜绝接口的经典模式,并实现其大部分或所有在接口中的方法同伴类。一个例子是Collection and AbstractCollection。现在,我们应该实现的接口本身的方法来提供默认功能。其实现该接口的类有选择覆盖的方法或继承的默认实现。
  2. 默认方法的另一个重要用途是interface evolution。假设我有一类球为: public class Ball implements Collection { ... }

现在的Java 8中的新功能在推出流。我们可以通过使用stream添加到接口方法来获取流。如果stream不是默认的方法,所有Collection接口的实现就已经打破,因为他们将不会执行这一新方法。添加非默认的方法接口没有source-compatible

但是,假如我们不重新编译类,并使用含有此类Ball旧的jar文件。本课程将加载罚款没有这个缺少方法,实例可以被创建,它似乎一切工作正常。但如果程序调用stream方法上Ball的情况下,我们会得到AbstractMethodError。所以制作方法默认解决了这两个问题。

另一答案

关于你的查询

所以,当应该用接口可以使用默认的方法什么时候应该抽象类中使用?是抽象类仍然在该方案中有用吗?

java的documentation 提供了完美的答案。

抽象类相比,接口:

抽象类是类似的接口。你不能实例化他们,他们可能包含有或没有实现声明的搭配方法。

但是,抽象类,你可以声明不是静态的,最终的领域,并界定公共,保护和私有的具体方法。

随着接口,所有的字段会自动公开,静态和决赛,并声明或定义(默认方式)的所有方法都是公开的。此外,您只能扩展一个类,不论它是抽象的,而可以实现任意数量的接口。

为他们每个人的使用情况如下SE后已经解释:

What is the difference between an interface and abstract class?

是抽象类仍然在该方案中有用吗?

是。他们仍然是有用的。它们可以包含非静态,非最终方法和属性(受保护的,除了公私),这是不可能的,甚至与Java-8接口。

另一答案

在Java接口的默认方法使界面演变。

鉴于现有的接口,如果你想一个方法添加到它没有打破与旧版本接口的二进制兼容性,您有双手两种选择:添加默认或静态方法。事实上,添加到接口的任何抽象方法将必须通过实现这个接口的类或接口上impleted。

静态方法是唯一的一类。默认的方法是唯一的类的实例。

如果你添加默认的方法来将现有的接口,类和实现此接口的接口并不需要实现它。他们能

  • 实施的默认方法,它覆盖在实现接口的实现。
  • 重新声明这使得它抽象方法(不执行)。
  • 什么都不做(然后从实现的接口的默认方法是简单的继承)。

更多关于该主题here

另一答案

Remi Forax规则是你不抽象类设计。你与接口设计您的应用程序。 Watever是Java,无论是语言的版本。它是由SOLID原则,接口隔离原则的支持。

您可以在以后使用抽象类因式分解代码。现在与Java 8,你可以在界面中直接做到这一点。这是一个工具,而不是更多。

以上是关于接口与默认的方法VS在Java抽象类8的主要内容,如果未能解决你的问题,请参考以下文章

实际示例何时使用抽象类以及何时使用 Java 8 引入的接口(默认和静态方法)[重复]

java基础---接口和抽象类

随笔30 抽象类与接口

Java 8需要后卫(默认)方法[重复]

Q:接口与抽象类

Java抽象类与接口的区别