当前位置: 首页 > 面试题库 >

Java 8:虚拟扩展方法与抽象类

岳君之
2023-03-14
问题内容

我正在查看Java 8接口中的新虚拟扩展方法:

public interface MyInterface {
   default String myMethod() { 
      return "myImplementation"; 
   }
}

我的目的是允许接口随着时间的推移以及多重继承的发展而演变,但是在我看来,它们看上去非常像抽象类。

如果您要进行新工作,则是使用抽象类而不是扩展方法来为“接口”提供实现,或者这两种方法在概念上是否等效?


问题答案:

这种构造的主要目的是保持向后兼容性。在Java语言中添加闭包是一个重大的更改,需要对其进行更新以充分利用此功能。例如,Collection在Java
8中将有诸如forEach()与lambda结合使用的方法。简单地将这些方法添加到预先存在的Collection接口将不可行,因为它将破坏向后兼容性。我用Java
7实现的类Collection将不再编译,因为它缺少这些方法。因此,这些方法是通过“默认”实现引入的。如果您了解Scala,那么您会发现Java
interface越来越像Scala trait


至于接口与抽象类,在Java 8中两者仍然 不同
。例如,您仍然不能在接口中有构造函数。因此,这两种方法本身并不是“概念上等效的”。抽象类的结构更复杂,可以具有与之关联的状态,而接口则不能。您应该在程序的上下文中使用更有意义的方法,就像在Java
7及更低版本中一样。



 类似资料:
  • 我正在尝试对扩展抽象基的类进行单元测试。以下是“类似的类”,以供说明: 下面是我正在尝试的单元测试: 当我做这个测试的时候 java.lang.NullPointerException 在中 我知道自动连线的“滤水器”没有初始化。但接下来,我只想在我的单元测试中模拟抽象的“非抽象”方法。 我该如何使用EasyMock来实现这一点呢?另外,我不知道和应该做什么。

  • 本文向大家介绍Vmvare扩展虚拟机磁盘大小的方法,包括了Vmvare扩展虚拟机磁盘大小的方法的使用技巧和注意事项,需要的朋友参考一下 Vmvare设置好虚拟机的磁盘大小之后,发现磁盘空间不够了,这个时候怎么扩展磁盘的大小呢? 首先,在确保虚拟机关闭的情况下,右键设置,选择硬盘,扩展,这样就可以增加磁盘的大小。 但是由于未进行分区和磁盘挂载的设置,我们启动虚拟机以后并不能使用增加的磁盘空间,这个时

  • 这个类会被认为是一个抽象类,因为它有一个虚拟函数吗?我仍然能够创建一个动物对象并调用getFood成本(); 我认为抽象类不能被实例化,这是否意味着对象可以具有虚拟功能而不被认为是抽象类?

  • 本文向大家介绍C#扩展抽象基类,包括了C#扩展抽象基类的使用技巧和注意事项,需要的朋友参考一下 示例 与接口(可以描述为实现合同)不同,抽象类充当扩展的合同。 抽象类无法实例化,必须对其进行扩展,然后可以实例化生成的类(或派生类)。 抽象类用于提供通用实现 上面的示例显示了实现Car的任何扩展类如何自动接收HonkHorn方法。这意味着任何开发新汽车的开发人员都无需担心它将如何鸣笛。

  • HPB主链用的虚拟机跟ETH相同,所以在你开发HPB 合约的时候,需要先了解虚拟机的概念,虚拟机指的是,通过软件模拟的、具备完整硬件系统功能并运行在隔离环境下的完整计算机系统;比如虚拟化物理机VMware、Java虚拟机等。而以太坊虚拟机(Ethereum Virtual Machine,EVM)则是建立在以太坊区块链上的代码运行环境,其主要作用是处理以太坊系统内的智能合约。 简单来说,以太坊虚拟

  • 我试图给出一个完整的答案: "为什么/何时使用抽象类而不是接口。" 并寻找以下方面的验证/建议。 对此的一个答案是, 在具体类来定义特定类型之前,抽象类通常位于继承层次结构中接口的正下方(就像Java API中的许多示例一样),实现并固定接口定义的结构的一些公共方面。 使用抽象类的另一个很好的理由是类型之间有一个清晰的逻辑层次结构。抽象类具有组织层次结构的作用,同时通过作为抽象类而不是具体类,迫使