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

Java 8默认方法继承

薛楷
2023-03-14
问题内容

假设有以下几种类型:

public interface Base {

    default void sayHi(){
        System.out.println("hi from base");
    }
}

public interface Foo extends Base {
    @Override
    default void sayHi(){
        System.out.println("hi from foo");
    }
}

public interface Bar extends Base {
}

public class MyClass implements Foo, Bar {
    public static void main(String[] args) {
        MyClass c = new MyClass();
        c.sayHi();
    }
}

在这种情况下,如果main执行,将打印“ hi from
foo”。为什么Foo的实现优先?不Bar继承sayHi()Base,因为如果MyClass只实现BarBase则将调用实现?因此,仍然不编译代码是有意义的。另外,由于Bar应该具有Base的实现sayHi(),为什么我不能MyClass像这样重写它:

@Override
public void sayHi() {
    Bar.super.sayHi();
}

尝试这样做时会发生以下错误:

错误的类型限定符Bar在默认的超级调用方法中,sayHi()在Foo中被覆盖


问题答案:

在JLS
9.4.1中
几乎使用您的确切示例来指定此行为,只是更改了一些名称:

interface Top {
    default String name() { return "unnamed"; }
}
interface Left extends Top {
    default String name() { return getClass().getName(); }
}
interface Right extends Top {}

interface Bottom extends Left, Right {}

右侧从顶部继承name(),但底部从左侧而不是右侧继承name()。这是因为Left的name()会覆盖Top中的name()声明。

JLS似乎并没有给出我可以看到的任何特别具体的理由。这就是Java设计人员决定继承将起作用的方式。



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

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

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

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

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

  • 本文向大家介绍Java8默认方法Default Methods原理及实例详解,包括了Java8默认方法Default Methods原理及实例详解的使用技巧和注意事项,需要的朋友参考一下 这篇文章主要介绍了Java8默认方法Default Methods原理及实例详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 Java 8 引入了新的语言特性