Java8接口之默认方法与静态方法详解

目录
  • 前言
  • 为什么选择默认方法?
  • Java 8示例:接口中的默认方法
  • Java 8示例:接口中的静态方法
  • Java 8 - 抽象类与接口
  • 总结

前言

在Java8之前,java中的接口只能有抽象方法。默认情况下,接口的所有方法都是公共和抽象的。Java8允许接口具有默认和静态方法。我们在接口中使用默认方法的原因是,允许开发人员向接口添加新方法,而不会影响实现这些接口的类。

为什么选择默认方法?

例如,如果A、B、C和D等几个类实现了一个接口XYZInterface,那么如果我们向XYZInterface添加一个新方法,我们必须更改实现该接口的所有类(A、B、C和D)中的代码。在本例中,我们只有四个类实现了我们想要更改的接口,但是想象一下,如果有数百个类实现了一个接口,那么几乎不可能更改所有这些类中的代码。这就是为什么在Java8中,我们有了一个新概念“默认方法”。这些方法可以添加到任何现有接口中,我们不需要强制在实现类中实现这些方法,因此我们可以在不破坏代码的情况下将这些默认方法添加到现有接口中。

我们可以说,java 8中引入了默认方法的概念,以便在现有接口中添加新方法,从而使它们向后兼容。向后兼容性是在不破坏旧代码的情况下添加新功能。

接口中的静态方法与默认方法类似,只是我们不能在实现这些接口的类中重写这些方法。

Java 8示例:接口中的默认方法

MyInterface中的方法newMethod()是默认方法,这意味着我们不需要在实现类示例中实现该方法。通过这种方式,我们可以将默认方法添加到现有接口中,而不必担心实现这些接口的类。

interface MyInterface{
    /* This is a default method so we need not
     * to implement this method in the implementation
     * classes
     */
    default void newMethod(){
        System.out.println("Newly added default method");
    }
    /* Already existing public and abstract method
     * We must need to implement this method in
     * implementation classes.
     */
    void existingMethod(String str);
}
public class Example implements MyInterface{
    // implementing abstract method
    public void existingMethod(String str){
        System.out.println("String is: "+str);
    }
    public static void main(String[] args) {
        Example obj = new Example();

        //calling the default method of interface
        obj.newMethod();
        //calling the abstract method of interface
        obj.existingMethod("Java 8 is easy to learn"); 

    }
}

输出:

Newly added default method
String is: Java 8 is easy to learn

Java 8示例:接口中的静态方法

如上所述,接口中的静态方法与默认方法类似,因此我们不需要在实现类中实现它们。我们可以安全地将它们添加到现有接口中,而无需更改实现类中的代码。由于这些方法是静态的,我们不能在实现类中重写它们。

interface MyInterface{
    /* This is a default method so we need not
     * to implement this method in the implementation
     * classes
     */
    default void newMethod(){
        System.out.println("Newly added default method");
    }  

    /* This is a static method. Static method in interface is
     * similar to default method except that we cannot override
     * them in the implementation classes.
     * Similar to default methods, we need to implement these methods
     * in implementation classes so we can safely add them to the
     * existing interfaces.
     */
    static void anotherNewMethod(){
        System.out.println("Newly added static method");
    }
    /* Already existing public and abstract method
     * We must need to implement this method in
     * implementation classes.
     */
    void existingMethod(String str);
}
public class Example implements MyInterface{
    // implementing abstract method
    public void existingMethod(String str){
        System.out.println("String is: "+str);
    }
    public static void main(String[] args) {
        Example obj = new Example();

        //calling the default method of interface
        obj.newMethod();
        //calling the static method of interface
        MyInterface.anotherNewMethod();
        //calling the abstract method of interface
        obj.existingMethod("Java 8 is easy to learn");
    }
}

输出:

Newly added default method
Newly added static method
String is: Java 8 is easy to learn

Java 8 - 抽象类与接口

随着接口中默认方法的引入,抽象类似乎与Java8中的接口相同。然而,这并不是完全正确的,尽管我们现在可以像抽象类一样在接口中有具体的方法(带主体的方法),但这并不意味着它们是相同的。它们之间仍然没有什么区别,其中之一是抽象类可以有构造函数,而在接口中我们不能有构造函数。

接口的目的是提供完全抽象,而抽象类的目的是提供部分抽象。这仍然适用。界面就像是类的蓝图,通过引入默认方法,您可以简单地说,我们可以在界面中添加附加功能,而不会影响最终用户类。

默认方法和多重继承

当我们有两个具有相同签名的默认方法的接口时,可能会出现多重继承问题。让我们举个例子。

interface MyInterface{
    default void newMethod(){
        System.out.println("Newly added default method");
    }
    void existingMethod(String str);
}
interface MyInterface2{
    default void newMethod(){
        System.out.println("Newly added default method");
    }
    void disp(String str);
}
public class Example implements MyInterface, MyInterface2{
    // implementing abstract methods
    public void existingMethod(String str){
        System.out.println("String is: "+str);
    }
    public void disp(String str){
        System.out.println("String is: "+str);
    }

    public static void main(String[] args) {
        Example obj = new Example();
        //calling the default method of interface
        obj.newMethod();
    }
}

输出:

Error: Duplicate default methods named newMethod with the parameters () and () are inherited from the types MyInterface2 and MyInterface

这是因为我们在接口中都有相同的方法,而编译器不确定要调用哪个方法。

如何解决这个问题?

为了解决这个问题,我们可以在实现类中实现这个方法,如下所示:

interface MyInterface{
    default void newMethod(){
        System.out.println("Newly added default method");
    }
    void existingMethod(String str);
}
interface MyInterface2{  

    default void newMethod(){
        System.out.println("Newly added default method");
    }
    void disp(String str);
}
public class Example implements MyInterface, MyInterface2{
    // implementing abstract methods
    public void existingMethod(String str){
        System.out.println("String is: "+str);
    }
    public void disp(String str){
        System.out.println("String is: "+str);
    }
    //Implementation of duplicate default method
    public void newMethod(){
        System.out.println("Implementation of default method");
    }
    public static void main(String[] args) {
        Example obj = new Example();
        //calling the default method of interface
        obj.newMethod();
    }
}

输出:

Implementation of default method

首先我们要总体说一下,为什么要有这两个方法存在:

(1)原先的jdk7之类的,它们接口中的方法都是抽象方法,没有具体的实现,就相当于定义好了这个接口有哪些功能,却没有具体定义功能是怎么实现的,通常由接口的实现类来做具体功能实现。那么,如果面向接口编程,大家已经根据自己需要通过继承接口的方式来实现了自己的功能,突然有一天,产品提需求了,你需要给所有接口的实现类都添加一个新的功能即一个新的方法实现,而且这个方法可能大家都是一样的,那咋办?

jdk8以前的做法肯定是现在接口中定义这个抽象方法,然后所有实现类必须实现这个方法(不然接口中多出一个抽象方法,其他类都没有实现,编译是会报错的),如果实现类比较多,那改起来会很麻烦,这种情况下是不利于维护的。

那么我们在jdk8中就有了好的解决方式,就是在接口中加一个默认方法,这个默认方法有具体实现,这样就不用去修改实现类啦,很省事。

总结

到此这篇关于Java8接口之默认方法与静态方法的文章就介绍到这了,更多相关Java8默认方法与静态方法内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 深入理解Java8新特性之接口中的默认方法和静态方法

    1.接口中的默认方法和静态方法 Java 8中允许接口中包含具有具体实现的方法,该方法称为 "默认方法" ,默认方法使用 default 关键字修饰. 接口默认方法的 " 类优先 " 原则.若一个接口中定义了一个默认方法,而另外一个父类或接口中又定义了一个同名的方法时 选择父类中的方法.如果一个父类提供了具体的实现,那么接口中具有相同名称和参数的默认方法会被忽略. 接口冲突.如果一个父接口提供一个默认方法,而另一个接口也提供了一个具有相同名称和参数列表的方法(不管方

  • Java8中新特性Optional、接口中默认方法和静态方法详解

    前言 毫无疑问,Java 8是Java自Java 5(发布于2004年)之后的最重要的版本.这个版本包含语言.编译器.库.工具和JVM等方面的十多个新特性. Java 8是Java的一个重大版本,有人认为,虽然这些新特性领Java开发人员十分期待,但同时也需要花不少精力去学习.下面本文就给大家详细介绍了Java8中新特性Optional.接口中默认方法和静态方法的相关内容,话不多说了,来一起看看详细的介绍吧. Optional Optional 类(java.util.Optional) 是一个

  • Java8 接口默认方法和静态方法

    目录 1.默认接口方法 2.静态接口方法 3.两者的场景差异 前些日有同学问我Java接口中为什么要增加一个默认方法.在Java 8 中不单单增加了默认接口方法还增加了静态接口方法.今天就来聊聊这两个方法. 1.默认接口方法 java中的默认接口方法是这样定义的: public interface NewInterface { ​ void otherMethod(); default void doSomething() { System.out.println(" do something

  • Java8接口默认静态方法及重复注解原理解析

    接口默认方法和静态方法 默认方法 interface MyInterface1 { default String method1() { return "myInterface1 default method"; } } class MyClass{ public String method1() { return "myClass method"; } } /** * 父类和接口中都有相同的方法,默认使用父类的方法,即类优先 * @author 莫雨朵 * */

  • Java8新特性之接口中的默认方法和静态方法详解

    一.前言 Java 8 引入了默认方法以及可以在接口中定义的静态方法. 默认方法是一个普通的 java 方法,但以 default 关键字开头,静态方法像往常一样用 static 关键字声明. 二.为什么在 Java 接口中使用默认方法? 为什么java在接口中引入了默认方法. 假设一个拖拉机制造公司发布了操作拖拉机的标准接口,如如何挂挡或停车等. 开发者已经开发了不同类型的拖拉机来实现标准的拖拉机接口. 如果公司在其标准接口中增加了新的功能,如如何跳动拖拉机? 开发者需要对他们的类进行修改以定

  • Java8新特性之接口中的默认方法和静态方法

    写在前面 在Java8之前的版本中,接口中只能声明常量和抽象方法,接口的实现类中必须实现接口中所有的抽象方法.而在Java8中,接口中可以声明默认方法和静态方法,本文,我们就一起探讨下接口中的默认方法和静态方法. 接口中的默认方法 Java 8中允许接口中包含具有具体实现的方法,该方法称为"默认方法",默认方法使用 default 关键字修饰 . 例如,我们可以定义一个接口MyFunction,其中,包含有一个默认方法getName,如下所示. public interface MyF

  • Java8接口之默认方法与静态方法详解

    目录 前言 为什么选择默认方法? Java 8示例:接口中的默认方法 Java 8示例:接口中的静态方法 Java 8 - 抽象类与接口 总结 前言 在Java8之前,java中的接口只能有抽象方法.默认情况下,接口的所有方法都是公共和抽象的.Java8允许接口具有默认和静态方法.我们在接口中使用默认方法的原因是,允许开发人员向接口添加新方法,而不会影响实现这些接口的类. 为什么选择默认方法? 例如,如果A.B.C和D等几个类实现了一个接口XYZInterface,那么如果我们向XYZInter

  • Java8接口的默认方法

    Java8接口的默认方法 什么是默认方法,为什么要有默认方法? 简单说,就是接口可以有实现方法,而且不需要实现类去实现其方法.只需在方法名前面加个default关键字即可. 为什么要有这个特性?首先,之前的接口是个双刃剑,好处是面向抽象而不是面向具体编程,缺陷是,当需要修改接口时候,需要修改全部实现该接口的类,目前的 java 8之前的集合框架没有foreach方法,通常能想到的解决办法是在JDK里给相关的接口添加新的方法及实现.然而,对于已经发布的版本,是没法在给接口添加新方法的同时不影响已有

  • 一篇文章带你认识Java8接口的默认方法

    前言 Java8是Oracle于2014年3月发布的一个重要版本,其API在现存的接口上引入了非常多的新方法. 例如,Java8的List接口新增了sort方法.在Java8之前,则每个实现了List接口的类必须定义sort方法的实现,或者从父类中继承它的实现.想象一下,如果List接口的继承体系非常庞杂,那么整个集合框架的维护量有多么大! 为此,在Java8中引入了一种新的机制:接口支持申明带实现的方法. 默认方法 前文提到了Java8中List接口新增了sort方法,其源码如下: publi

  • Java8新特性之默认方法和静态方法

    前言 在Java 8之前,默认情况下,接口中的所有方法都是公共的和抽象的.但是这一限制在Java 8中被打破了,Java 8允许开发人员在接口中添加新方法,而无需在实现这些接口的类中进行任何更改. 为什么会有默认方法? 主要是为了方便扩展已有接口:如果没有默认方法,假如给Java中的某个接口添加一个新的抽象方法,那么所有实现了该接口的类都得修改,影响将非常大. 举个例子,Sortable <T>接口以及实现该接口的类SortableNumberCollection和SortableString

  • Java8中的默认方法(面试者必看)

    背景 在Java8之前,定义在接口中的所有方法都需要在接口实现类中提供一个实现,如果接口的提供者需要升级接口,添加新的方法,那么所有的实现类都需要把这个新增的方法实现一遍,如果说所有的实现类能够自己控制的话,那么还能接受,但是现实情况是实现类可能不受自己控制.比如说Java中的集合框架中的List接口添加一个方法,那么Apache Commons这种框架就会很难受,必须修改所有实现了List的实现类 现在的接口有哪些不便 向已经发布的接口中添加新的方法是问题的根源,一旦接口发生变化,接口的实现者

随机推荐