📅  最后修改于: 2023-12-03 14:42:12.702000             🧑  作者: Mango
Java 8引入了一项重要的新特性 - 默认方法(Default Methods),也称为接口的扩展方法。该特性允许在接口中定义具有默认实现的方法,这些方法可以直接从接口中调用或继承,而无需在实现类中重新实现。
默认方法允许在不破坏现有代码的情况下,向已经存在的接口添加新功能。这对于一些设计好的接口,希望在未来添加一些额外的功能非常有用。与传统的接口相比,使用默认方法可以更容易地向现有接口添加新的方法,而不会影响到实现该接口的所有类。
默认方法是在接口中定义的具有默认实现的方法。语法如下:
public interface MyInterface {
// 默认方法
default void myDefaultMethod() {
// 默认实现
}
// 抽象方法
void myAbstractMethod();
}
接口中的默认方法使用default
关键字进行修饰,并且必须提供默认的实现。注意,接口中可以包含其他抽象方法,这些方法仍然需要在实现类中进行实现。
默认方法可以直接从接口中调用或者被实现类继承。当实现类没有提供该方法的实现时,将自动使用接口中定义的默认实现。
public class MyClass implements MyInterface {
// 不需要重写myDefaultMethod()方法,直接继承默认实现
@Override
public void myAbstractMethod() {
// 实现抽象方法
}
}
在上面的例子中,MyClass
类实现了MyInterface
接口,并提供了对myAbstractMethod()
方法的实现。由于没有对myDefaultMethod()
方法进行重写,MyClass
类将使用接口中定义的默认实现。
当一个类实现了多个接口,这些接口中包含具有相同名称的默认方法时,就会发生冲突。解决冲突的方法如下:
实现类可以重写默认方法,从而覆盖接口中的默认实现。
public class MyClass implements MyInterfaceA, MyInterfaceB {
@Override
public void myDefaultMethod() {
// 重写默认方法
}
}
如果一个类实现了多个接口,这些接口中包含具有相同名称的默认方法,那么接口中定义的方法具有更高的优先级。可以使用接口名.super.方法名()
调用指定接口的默认方法。
public interface MyInterfaceA {
default void myDefaultMethod() {
// 默认实现A
}
}
public interface MyInterfaceB {
default void myDefaultMethod() {
// 默认实现B
}
}
public class MyClass implements MyInterfaceA, MyInterfaceB {
@Override
public void myDefaultMethod() {
MyInterfaceA.super.myDefaultMethod(); // 调用接口A的默认方法
MyInterfaceB.super.myDefaultMethod(); // 调用接口B的默认方法
}
}
在上面的例子中,MyClass
类实现了MyInterfaceA
和MyInterfaceB
接口,并重写了myDefaultMethod()
方法。通过使用接口名.super.方法名()
调用指定接口的默认方法,可以解决冲突。
Java 8中的默认方法是一项强大的特性,使得接口的演化变得更加简单和灵活。它允许我们向现有接口添加新的功能,而无需修改所有的实现类。但需要注意处理接口间的冲突问题,以确保代码的正确性。
希望上述内容对介绍Java 8中的默认方法有所帮助!