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 提供了一套规则来解决这种冲突:
- 类优先:如果一个类实现了多个接口,并且这些接口中包含同名的默认方法,那么实现类会优先选择父类中的方法。
- 接口冲突:如果一个类实现了多个接口,并且这些接口中包含同名的默认方法,那么实现类必须手动指定要调用的方法。
让我们来看一个例子:
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();
}
}
在上面的例子中,接口 A
和 B
中都包含默认方法 foo
,并且实现类 MyClass
实现了这两个接口。在实现类中,我们手动选择了要调用的方法。
总结
在 Java 8 中,引入了默认方法这一特性,它使得接口可以包含具体实现的方法。默认方法的引入解决了接口向后兼容的问题,可以为接口添加新的方法而不影响已有的实现类。同时,Java 也提供了一