Java 8 接口中的默认方法和静态方法

2024 年 12 月 26 日 | 阅读 4 分钟

在 Java 编程语言中,接口是一种引用类型。接口与类相似。它只能包含常量、方法签名、默认方法、静态方法、嵌套类型和私有方法(Java 9 中引入)。

方法体只存在于默认方法静态方法中(Java 9 中引入了私有方法)。请注意,接口不能实例化。它只能由类实现或由其他接口扩展。

Java 8 引入了各种新功能,包括 lambda 表达式、函数式接口、方法引用、流、Optional 以及接口中的静态和默认方法。

在本节中,我们将通过 Java 程序讨论如何在接口中使用静态和默认方法

为什么要使用默认方法?

在接口中引入默认方法的一个主要原因是增强 Java 8 中的 Collections API 以支持 lambda 表达式。如果层次结构中的任何类具有相同签名的类,则默认方法将变得无关紧要。默认方法不能覆盖 Java 中的方法。

默认方法

Java 8 引入了默认方法来解决更改接口的问题。在默认方法之前添加到接口的新方法会导致实现该接口的所有类出错。由于默认方法,接口可以添加其他方法,而无需实现类提交实现。

默认方法使用 default 关键字在方法签名中声明。此关键字将默认方法与接口中的常规抽象方法区分开来。

语法

用例

1. 向后兼容性

没有默认方法,向已经有多个实现的接口添加新方法可能会导致问题。通过使用默认方法,您可以扩展接口的功能,而不会影响已经实现的实现。

2. 菱形问题

如果一个类实现了两个具有冲突默认方法的接口,则实现类必须显式选择其中一个方法或提供其实现。

MethodImplementation.java

输出

Regular method implementation
Default method implementation

解释

在此实例中,MyInterface 中存在默认方法 defaultMethod()。类 MyClass 提供了常规方法的具体实现,该类也实现了 MyInterface。如果类不为默认函数提供实现,则默认行为将向下传递给该类。

静态方法

Java 8 除默认方法外,还在接口中添加了静态方法。这些方法可以在接口本身上调用,而无需接口实例;它们类似于类中的静态方法。将静态方法添加到接口的目的,是为了提供一种在接口内部组织类似实用方法的方法。与默认方法不同,静态方法不包含在接口的实现类 API 中,也不依赖于接口的实例。

语法

使用 static 关键字在接口中声明静态方法。该关键字表示方法与接口本身相关联,而不是与实现类的实例相关联。

避免使用工具类

在 Java 8 之前,实用方法通常放在工具类中。有了接口中的静态方法,就不需要仅仅为了相关的静态方法而创建单独的工具类,从而实现了更内聚的代码组织。

用例

1. 实用技术

具有静态方法的接口可用于聚合与接口概念相关的实用方法。这些技术提供了非实例特定的标准功能。

2. 无继承冲突

与实例方法不同,静态方法不参与多个继承冲突。因为静态方法是使用接口名称调用的,所以如果一个类实现了多个具有相同静态方法的接口,也不会发生冲突。

StaticMethod.java

输出

Result: 8
Square root: 5.0

解释

此示例显示了 MyMath 接口的常规方法 calculate(int a, int b) 和静态方法 squareRoot(int num)。无需首先创建静态方法的实例,就可以直接在接口上调用它。

上述程序可以写成如下

StaticMethod.java

输出

Result: 8
Square root: 5.0

结论

总之,静态方法提供了一种整洁的方式来组合与接口相关的实用方法,从而消除了对独立工具类的需求。相比之下,默认方法允许接口在不影响现有代码的情况下进行演进。这两种特性都有助于使 Java 代码设计更具适应性和可重用性。