当前位置: 首页 > 知识库问答 >
问题:

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

胡曾笑
2023-03-14

为什么我们在Java8的接口中需要Defender方法,因为我们已经有了抽象类。我在网上找到了各种各样的答案,比如:

但是抽象类是用于部分抽象的,因为我们的接口实际上是一个纯抽象类,那么为什么它们是接口内部的默认方法呢?

共有1个答案

边翔宇
2023-03-14

通过将功能放在抽象基类中共享功能的问题在于,一个类可以从一个基类派生。当您希望从多个基继承功能时,这是一个限制。

当您需要从已经有基类的类实现接口时,通过抽象基类共享功能也可能会成为一个问题。在这种情况下,您根本无法派生新类,因为您必须从两个基中选择一个,而您可能同时需要这两个基。

默认方法优雅地解决了这个问题:将您的公共实现放置到默认方法中允许您不受限制地共享代码。

下面是一个示例:考虑一个看起来像JDBC的resultset的接口,它有两种方式访问同一列--按名称和按索引。接口可以这样编码:

interface ResultSet2 {
    int findColumn(String columnLabel);
    String getString(int index);
    long getLong(int index);
    default long getLong(String columnLabel) {
        return getLong(findColumn(columnLabel));
    }
    default String getString(String columnLabel) {
        return getString(findColumn(columnLabel));
    }
}

任何实现resultset2的人都必须实现三个方法,并免费获得其余两个方法。他们可以选择提供另一种实现,但这是可选的。

 类似资料:
  • 主要内容:1 Java8 默认方法的介绍,2 Java8 默认方法的案例1 Java8 默认方法的介绍 Java提供了一种在接口内部创建默认方法的功能。在接口内部定义并带有默认标记的方法称为默认方法。这些方法是非抽象方法。 2 Java8 默认方法的案例 在下面的示例中,Sayable是一个功能接口,其中包含默认值和抽象方法。默认方法的概念用于定义具有默认实现的方法。您还可以覆盖默认方法,以为该方法提供更具体的实现。 输出结果为:  

  • 为什么上面的代码有编译错误“java:default method equals in interface Table重写java.lang.Object的一个成员”?难道我们不能使用接口默认方法重写hashCode和equals方法吗?假设我在同一个接口中有方法来确定实现这个接口的对象的相等性?

  • Java8包含了一个名为Defender methods的新特性,它允许在接口中创建默认方法实现。 对于在接口中添加新方法,他们不可能只添加一个新方法而不破坏以前的版本。因此,他说,为了迎合这一点,增加了默认方法的新特性。 现在我的问题基本上是,缺省方法只在需要向接口添加新方法而不破坏客户端代码时有用吗?或者它还有其他的用途吗?

  • 问题内容: 拥有具有默认方法的接口的动态代理,如何调用默认方法?通过使用类似的方法,您可以得到名为的代理调用处理程序(这在某种程度上是正确的,因为您没有为此接口实现的类)。 我有一个使用ASM来创建实现接口的类并将此类调用委派给此类实例的解决方法。但这不是一个好的解决方案,特别是如果默认方法调用其他接口方法(您将获得委托人乒乓球)。JLS对此问题出人意料地保持沉默… 这里是一个小代码示例: 问题答

  • 在Java8中使用缺省方法作为穷人版本的traits是一种安全的做法吗? 有人说,如果你只是为了熊猫而使用它们,可能会让熊猫伤心,因为它很酷,但这不是我的本意。人们还经常提醒说,引入缺省方法是为了支持API演进和向后兼容性,这是真的,但这并不使使用它们作为特征本身是错误的或扭曲的。 我脑海中有以下实际用例: 或者,定义: 关于SO的几个问题与Java vs Scala特性有关;这不是重点。我也不仅

  • 本文向大家介绍Java8新特性之默认方法(default)浅析,包括了Java8新特性之默认方法(default)浅析的使用技巧和注意事项,需要的朋友参考一下 一、什么是默认方法,为什么要有默认方法 简单说,就是接口可以有实现方法,而且不需要实现类去实现其方法。只需在方法名前面加个default关键字即可。 为什么要有这个特性?首先,之前的接口是个双刃剑,好处是面向抽象而不是面向具体编程,缺陷是,