Java 8 接口里的默认方法特性研究

Wesley13
• 阅读 667

这篇文章我们将要探讨Java 8中接口里的默认方法特性。Java8指出“默认方法使得新功能被添加到库中的接口里面,同时又能保证与这些接口老版本代码的二进制兼容性。

这些年Java进化升级了很多,在Java库中引入的接口需要添加新的功能。在没有默认方法特性时,当你往接口中添加新方法时,接口内部所有实现的类都要历经一些修改。这将导致上千行的代码修改工作量。为了避免这点,Java 8引入了默认对象方法。亦即,如果你想要往现存的接口中添加任何功能,你只需添加默认方法特性而不会影响接口实现形式。

让我们看一些例子来更好的理解它。例如,我声明了一个具有打开和读取功能的接口“BookIterface”。接口的类需要实现打开和读取方法。

package org.smarttechie;

/** * The interface is intended to open and read. The implementors should * implement the methods to open and read. * * @author Siva Prasad Rao Janapati * */
public interface BookInterface {
    /** * The method opens the book */
    public void openTheBook();

    /** * The method reads the book */
    public void readTheBook();
}

现在,我们提供上面接口的实现代码。

package org.smarttechie;

/** * The JavaBookImpl is the implementation of BookInterface * * @author Siva Prasad Rao Janapati * */
public class JavaBookImpl implements BookInterface {
    /** * This opens the book */
    @Override
    public void openTheBook() {
        System.out.println("The Java book is opened");
    }

    /** * This reads the book */
    @Override
    public void readTheBook() {
        System.out.println("Reading the Java book");
    }
}

现在,我们想要给接口提供一个关闭功能。如果你直接添加关闭功能到book接口中,现存的实现类需要历经一些修改。有了默认方法特性后,我们能给book接口直接添加关闭功能。默认方法对所有实现都可用。

package org.smarttechie;

/** * The interface is intended to open and read. The implementors should * implement the methods to open and read. * * @author Siva Prasad Rao Janapati * */
public interface BookInterface {
    /** * The method opens the book */
    public void openTheBook();

    /** * The method reads the book */
    public void readTheBook();
    
    /** * The default method implementation */
    public default void closeTheBook() {
        System.out.println("Closting the book");
    }
}

package org.smarttechie;

/** * The JavaBookImpl is the implementation of BookInterface * * @author Siva Prasad Rao Janapati * */
public class JavaBookImpl implements BookInterface {
    /** * This opens the book */
    @Override
    public void openTheBook() {
        System.out.println("The Java book is opened");
    }

    /** * This reads the book */
    @Override
    public void readTheBook() {
        System.out.println("Reading the Java book");
    }

    public static void main(String[] args) {
        BookInterface bookInter = new JavaBookImpl();
        // Call the default method declared in BookInterface
        bookInter.closeTheBook();
        JavaBookImpl book = new JavaBookImpl();
        book.closeTheBook();
    }
}

下面给出了上述调用方法的字节码。从字节码中,我们可以认为默认方法是一种“虚方法”。

Java 8 接口里的默认方法特性研究

如果你想,你可以重载实现类中的默认方法:

package org.smarttechie;

/** * The JavaBookImpl is the implementation of BookInterface * * @author Siva Prasad Rao Janapati * */
public class JavaBookImpl implements BookInterface {
    /** * This opens the book */
    @Override
    public void openTheBook() {
        System.out.println("The Java book is opened");
    }

    /** * This reads the book */
    @Override
    public void readTheBook() {
        System.out.println("Reading the Java book");
    }

    /* * This closes the book */
    public void closeTheBook() {
        System.out.println("Closing the JAVA book");
    }

    public static void main(String[] args) {
        BookInterface book = new JavaBookImpl();
        book.closeTheBook();
    }
}

到这会儿,你可能有一个疑问,如果我们实现了两个具有同样默认方法签名的接口会怎样?在那种情况下,调用实现会得到下面的编译错误提示。

“用参数()和()复制名为closedTheBook的默认方法是继承于TheBookInterface和BookInterface的类型。”

package org.smarttechie;

public interface TechBookInterface {
        /** * The default method implementation */
    public default void closeTheBook() {
        System.out.println("Closing the book");
    }
}

package org.smarttechie;

/** * The JavaBookImpl is the implementation of BookInterface * * @author Siva Prasad Rao Janapati * */
public class JavaBookImpl implements BookInterface, TechBookInterface {
    /** * This opens the book */
    @Override
    public void openTheBook() {
        System.out.println("The Java book is opened");
    }

    /** * This reads the book */
    @Override
    public void readTheBook() {
        System.out.println("Reading the Java book");
    }

    public static void main(String[] args) {
        BookInterface book = new JavaBookImpl();
        book.closeTheBook();
    }
}

为了避免这个编译错误,我们需要在实现类中显式地定义那个具有同样签名的方法。

package org.smarttechie;

/** * The JavaBookImpl is the implementation of BookInterface * * @author Siva Prasad Rao Janapati * */
public class JavaBookImpl implements BookInterface, TechBookInterface {
    /** * This opens the book */
    @Override
    public void openTheBook() {
        System.out.println("The Java book is opened");
    }

    /** * This reads the book */
    @Override
    public void readTheBook() {
        System.out.println("Reading the Java book");
    }

    public void closeTheBook() {
        System.out.println("Closing the JAVA book");
    }

    public static void main(String[] args) {
        BookInterface book = new JavaBookImpl();
        book.closeTheBook();
    }
}

更深入的了解阅读,可以参考下面的链接:

点赞
收藏
评论区
推荐文章
待兔 待兔
4个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Wesley13 Wesley13
3年前
java8中接口中的default方法
在java8以后,接口中可以添加使用default或者static修饰的方法,在这里我们只讨论default方法,default修饰方法只能在接口中使用,在接口种被default标记的方法为普通方法,可以直接写方法体。实现类会继承接口中的default方法如果接口A中有default方法:publicinterfaceA{publi
Wesley13 Wesley13
3年前
java8中的接口与时间操作
java8中接口可以有默认方法(用default修饰,可以有多个)和静态方法了。publicinterfaceTran{defaultpublicStringgetName(){return"zhangsan";}d
Wesley13 Wesley13
3年前
Java8 默认方法 default method
Java8引入了新的语言特性——默认方法(DefaultMethods)。Defaultmethodsenablenewfunctionalitytobeaddedtotheinterfacesoflibrariesandensurebinarycompatibilitywithcodewritte
Wesley13 Wesley13
3年前
Java日期时间API系列31
  时间戳是指格林威治时间1970年01月01日00时00分00秒起至现在的总毫秒数,是所有时间的基础,其他时间可以通过时间戳转换得到。Java中本来已经有相关获取时间戳的方法,Java8后增加新的类Instant等专用于处理时间戳问题。 1获取时间戳的方法和性能对比1.1获取时间戳方法Java8以前
Wesley13 Wesley13
3年前
Java8之Stream
在使用Stream之前先介绍几个概念:1、函数式接口2、常用的函数式接口3、Lambda4、方法引用 1、函数式接口  1.只定义了一个抽象方法的接口。  2.JDK8接口中的静态方法和默认方法,都不算是抽象方法。  3.接口默认继承java.lang.Object,所以如果接口显示声明覆盖了Object中方法,
Wesley13 Wesley13
3年前
Java8—一万字的Lambda表达式的详细介绍与应用案例
  基于Java8详细介绍了lambda表达式的语法与使用,以及方法引用、函数式接口、lambda复合等Java8的新特性!文章目录1Lambda的概述2函数式接口2.1Consumer消费型接口2.2Supplier供给型接口2.3Function<T,R函数型接口
Stella981 Stella981
3年前
JOptionPane修改图标
1.在Linux平台下.JOptionPane会显示Java默认的图标,在window平台不显示图标,如何替换这个图标了?2JOptionPane.setIcon(Icon)修改的是内容区域的icon,而不是左上角的Icon.所以需要通过修改Jdialog/Frame的图标来达到修改默认图标的问题.3.代码:if(JOptio
Wesley13 Wesley13
3年前
Java 接口基础详解
目录Java接口示例实现一个接口接口实例实现多个接口方法签名重叠接口变量接口方法接口默认方法接口与继承继承与默认方法接口与多态性在Java中,接口是一个抽象类型,有点类似于类,但Java接口只能包含方法签名与属性,
Wesley13 Wesley13
3年前
Java8 新特性 函数式接口
什么是函数式接口  函数式接口是Java8引用的一个新特性,是一种特殊的接口:SAM类型的接口(SingleAbstractMethod)。但是它还是一个接口,只是有些特殊罢了。  函数式接口的出现主要是为了配合Java8的另一个新特性Lamdba表达式来使用。接口中只有一个抽象方法接口