Java 8接口变更( 静态方法,默认方法) 您所在的位置:网站首页 接口不能有静态方法 Java 8接口变更( 静态方法,默认方法)

Java 8接口变更( 静态方法,默认方法)

2024-07-15 15:38| 来源: 网络整理| 查看: 265

Java 8接口更改包括接口中的静态方法和默认方法。在Java 8之前,只能在接口有方法声明。但是从Java 8开始,我们可以在接口中使用默认方法和静态方法。

设计接口一直是一项艰巨的工作,因为如果想在接口中添加其他方法,则需要在所有实现类中进行更改。随着接口的老化,实现它的类的数量可能会增长到无法扩展接口的程度。这就是为什么在设计应用程序时,大多数框架都提供了一个基本实现类,然后扩展它并覆盖适用于应用程序的方法。

让我们看看默认的接口方法和静态接口方法以及它们在Java 8接口更改中引入的原因。

Java接口默认方法

要在java接口中创建默认方法,需要在方法签名中使用default关键字。例如,

public interface Interface1 { void method1(String str); default void log(String str){ System.out.println("I1 logging::"+str); } }

请注意,void log(String str)是Interface1接口中的默认方法。现在,当一个类实现Interface1时,不一定要为接口的默认方法提供实现。此功能将帮助我们使用其他方法扩展接口,所需要的只是提供默认实现。

假设有另外一个具有以下方法的接口:

public interface Interface2 { void method2(); default void log(String str){ System.out.println("I2 logging::"+str); } }

我们知道Java不允许扩展多个类,因为它会导致“Diamond Problem”,编译器无法决定使用哪个超类方法。使用默认方法,接口也会出现菱形问题。因为如果一个类实现了Interface1和Interface2并且没有实现常见的默认方法,编译器无法决定选择哪一个。

扩展多个接口是Java不可或缺的一部分,可以在核心Java类以及大多数企业应用程序和框架中找到它。因此,为了确保接口中不会出现此问题,必须为接口的常见默认方法提供实现。因此,如果一个类正在实现上述接口,则必须为log()方法提供实现,否则编译器将抛出编译时错误。

实现Interface1和Interface2接口的类如下所示:

public class MyClass implements Interface1, Interface2 { @Override public void method2() { } @Override public void method1(String str) { } @Override public void log(String str){ System.out.println("MyClass logging::"+str); Interface1.print("abc"); } }

关于java接口默认方法的关键点:

Java接口默认方法有利于扩展接口,而不必担心破坏实现类。Java接口默认方法缩小了接口和抽象类之间的差异。Java 8接口的默认方法将避免使用实用程序类,例如,可以在接口本身中提供所有Collections类方法。Java接口默认方法将删除基本实现类,可以提供默认实现,实现类可以选择覆盖哪一个。在接口中引入默认方法的一个主要原因是增强Java 8中的Collections API以支持lambda表达式。如果层次结构中的任何类具有具有相同签名的方法,则默认方法变得无关紧要。默认方法不能覆盖java.lang.Object中的方法。原因很简单,因为Object是所有java类的基类。因此,即使将Object类方法定义为接口中的默认方法,它也将是无用的,因为将始终使用Object类方法。这就是为什么要避免混淆,不能有重写Object类方法的默认方法。Java接口默认方法也称为Defender方法或虚拟扩展方法。 Java接口静态方法

Java接口静态方法类似于默认方法,除了不能在实现类中覆盖它们。此功能有助于避免在实现类中实现不良而导致的不良结果。让我们通过一个简单的例子来了解。

public interface MyData { default void print(String str) { if (!isNull(str)) System.out.println("MyData Print::" + str); } static boolean isNull(String str) { System.out.println("Interface Null Check"); return str == null ? true : "".equals(str) ? true : false; } }

现在让我们看一个具有isNull()方法但实现较差的实现类。

public class MyDataImpl implements MyData { public boolean isNull(String str) { System.out.println("Impl Null Check"); return str == null ? true : false; } public static void main(String args[]){ MyDataImpl obj = new MyDataImpl(); obj.print(""); obj.isNull("abc"); } }

请注意,isNull(String str)是一个简单的类方法,它不会覆盖接口方法。例如,如果我们将@Override注释添加到isNull()方法,则会导致编译器错误。

现在,当我们运行应用程序时,得到以下输出结果 -

Interface Null Check Impl Null Check

如果将接口方法从static变为default,将得到以下输出结果 -

Impl Null Check MyData Print:: Impl Null Check

Java接口静态方法只对接口方法可见,如果从MyDataImpl类中删除isNull()方法,我们将无法将它用于MyDataImpl对象。但是,与其他静态方法一样,我们可以使用类名称的接口静态方法。例如,有效的语句将是:

boolean result = MyData.isNull("abc");

关于java接口静态方法的注意事项:

Java接口静态方法是接口的一部分,不能将它用于实现类对象。Java接口静态方法适用于提供实用程序方法,例如null检查,集合排序等。Java接口静态方法通过不允许实现类覆盖它们来提供安全性。不能为Object类方法定义接口静态方法,会得到编译错误为“这个静态方法不能隐藏来自Object的实例方法”。这是因为它在java中是不允许的,因为Object是所有类的基类,不能有一个类级静态方法和另一个具有相同签名的实例方法。可以使用java接口静态方法来删除诸如Collections之类的实用程序类,并将其所有静态方法移动到相应的接口,这很容易找到和使用。 Java功能接口

在结束之前,介绍一下Functional接口。只有一个抽象方法的接口称为功能接口。

引入了新的注释@FunctionalInterface以将接口标记为功能接口。@FunctionalInterface注释是一种避免在功能接口中意外添加抽象方法的工具。使用它是可选的但很好的做法。

功能接口是期待已久的,并且备受追捧Java 8的特性,因为它使我们能够使用lambda表达式来实例化它们。添加了一个带有大量功能接口的新包java.util.function,以便为lambda表达式和方法引用提供目标类型。

上一篇: java中方法重载和方法重写的区别 下一篇:哥,这回真没有了


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有