Java 如果假设一个接口是完全抽象的,那么这段代码为什么会工作?

Java 如果假设一个接口是完全抽象的,那么这段代码为什么会工作?,java,interface,compiler-errors,Java,Interface,Compiler Errors,您好,我是java新手,我在java编译器中测试了以下代码,但由于我对接口的理解不能有具体的方法,但这一个有具体的方法和工作原理,您能解释一下为什么吗??和输出 冲刺 不幸的是,有一些低质量的Java教程网站没有命名,说Java接口是完全抽象的;i、 e.您不能在接口中包含方法代码。还有很多老文章和博客都说了同样的话。还有旧课本 这曾经是真的。2014年之前。这不再是真的了。。。对于任何尚未过期的Java版本 在Java8中,该语言被扩展以支持默认方法。这些是完整的,即不是在接口本身中声明/定义

您好,我是java新手,我在java编译器中测试了以下代码,但由于我对接口的理解不能有具体的方法,但这一个有具体的方法和工作原理,您能解释一下为什么吗??和输出

冲刺


不幸的是,有一些低质量的Java教程网站没有命名,说Java接口是完全抽象的;i、 e.您不能在接口中包含方法代码。还有很多老文章和博客都说了同样的话。还有旧课本

这曾经是真的。2014年之前。这不再是真的了。。。对于任何尚未过期的Java版本

在Java8中,该语言被扩展以支持默认方法。这些是完整的,即不是在接口本身中声明/定义的隐式抽象方法。这些默认方法由实现声明接口的所有类继承,并且可以被重写。。。类似于从类继承的方法

将默认方法与抽象类中的方法区分开来的一点是,默认方法不能直接引用任何实例字段。默认方法引用其状态的唯一方法是通过其他非默认方法调用

有关默认方法的详细信息,请阅读Oracle Java教程:

在周围的页面中,有很多关于继承如何在Java中工作的正确/最新信息

在您的示例中,有两个接口Jog和Run,它们都声明了一个带有签名walk的默认方法。Sprint类实现了这两个接口,因此这两个walk方法在概念上都是继承的。那将是模棱两可的。。。如果不是因为Sprint也用自己的声明覆盖继承的walk


所以。。。当您在Sprint对象上调用walk时,您会得到覆盖。

Since,接口有默认方法。自Java 8以来,接口可以有默认方法。那些默认方法可以写在它们里面??也许只是研究一下默认方法是什么?当有数千页的文档需要查看时,试图在评论中解释它似乎很奇怪。
interface Run {
    default void walk() {
        System.out.print("Walking and running!");
    }
}
interface Jog {
    default void walk() {
        System.out.print("Walking and jogging!");
    }
}
public class Sprint implements Run, Jog {
    public void walk() {
        System.out.print("Sprinting!");
    }

    public static void main(String[] args) {
        new Sprint().walk();
    }
}