Java 中defult是什么

在 Java 8 中引入了一个新的关键字 default,它被用于接口中的方法。在之前的 Java 版本中,接口中的所有方法都是抽象方法,需要实现类去重写这些方法。但是在 Java 8 中,我们可以在接口中定义默认方法,并且这些方法可以直接使用,而不需要实现类去重写它们。那么 default 到底是什么呢?它有什么作用呢?接下来我们将详细讨论这个问题。

默认方法

默认方法是指在接口中可以包含具体实现的方法。简单来说,默认方法就是接口中可以有方法体的方法。通过使用 default 关键字,我们可以在接口中为某些方法提供默认实现,而不需要实现类去重写这些方法。

让我们来看一个简单的例子:

// 定义一个接口
interface MyInterface {
    // 默认方法
    default void defaultMethod() {
        System.out.println("This is a default method.");
    }

    // 抽象方法
    void abstractMethod();
}

// 实现接口
class MyClass implements MyInterface {
    @Override
    public void abstractMethod() {
        System.out.println("This is the implementation of abstractMethod.");
    }
}

public class Main {
    public static void main(String[] args) {
        MyClass myClass = new MyClass();

        // 调用默认方法
        myClass.defaultMethod();

        // 调用抽象方法
        myClass.abstractMethod();
    }
}

在上面的例子中,我们定义了一个接口 MyInterface,其中包含一个默认方法 defaultMethod 和一个抽象方法 abstractMethod。然后我们实现了这个接口,并在实现类中实现了抽象方法。在主类中,我们实例化了实现类,并调用了默认方法和抽象方法。

为什么需要默认方法

默认方法的引入使得接口可以向后兼容,不需要修改所有实现这个接口的类,就可以为接口添加新的方法。

在 Java 8 之前,如果我们向一个已经存在的接口添加新的方法,那么所有实现这个接口的类都需要去实现这个新方法。这可能会导致一些问题,特别是当接口被广泛使用时。使用默认方法,我们可以给接口添加新的方法,而不会影响已有的实现类。

默认方法的冲突解决

当一个类实现了多个接口,并且这些接口中包含同名的默认方法时,就会产生冲突。Java 提供了一套规则来解决这种冲突:

  1. 类优先:如果一个类实现了多个接口,并且这些接口中包含同名的默认方法,那么实现类会优先选择父类中的方法。
  2. 接口冲突:如果一个类实现了多个接口,并且这些接口中包含同名的默认方法,那么实现类必须手动指定要调用的方法。

让我们来看一个例子:

interface A {
    default void foo() {
        System.out.println("A");
    }
}

interface B {
    default void foo() {
        System.out.println("B");
    }
}

class MyClass implements A, B {
    // 手动选择要调用的方法
    @Override
    public void foo() {
        A.super.foo(); // 选择接口 A 中的默认方法
        B.super.foo(); // 选择接口 B 中的默认方法
    }
}

public class Main {
    public static void main(String[] args) {
        MyClass myClass = new MyClass();
        myClass.foo();
    }
}

在上面的例子中,接口 AB 中都包含默认方法 foo,并且实现类 MyClass 实现了这两个接口。在实现类中,我们手动选择了要调用的方法。

总结

在 Java 8 中,引入了默认方法这一特性,它使得接口可以包含具体实现的方法。默认方法的引入解决了接口向后兼容的问题,可以为接口添加新的方法而不影响已有的实现类。同时,Java 也提供了一