Java 8 介面裡的預設方法特性
本文由碼農網 – civic5216原創翻譯,轉載請看清文末的轉載要求,歡迎參與我們的付費投稿計劃!
這篇文章我們將要探討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(); } }
下面給出了上述呼叫方法的位元組碼。從位元組碼中,我們可以認為預設方法是一種“虛方法”。
如果你想,你可以過載實現類中的預設方法:
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(); } }
更深入的瞭解閱讀,可以參考下面的連結:
- https://jcp.org/en/jsr/detail?id=335
- https://docs.oracle.com/javase/tutorial/java/IandI/defaultmethods.html
譯文連結:http://www.codeceo.com/article/java-8-interface-default-method.html
英文原文:Java 8 – Default Methods in Interfaces
翻譯作者:碼農網 – civic5216
[ 轉載必須在正文中標註並保留原文連結、譯文連結和譯者等資訊。]
相關文章
- java8 新特性之預設方法Java
- 【Java8新特性】介面中的預設方法和靜態方法,你都掌握了嗎?Java
- java8介面的靜態方法和預設方法Java
- java8新特性之函式式介面、lambda表示式、介面的預設方法、方法和建構函式的引用Java函式
- C# 8: 預設介面方法C#
- Java8 預設方法Java
- java8特性-函式式介面Java函式
- Java8的新特性--函式式介面Java函式
- Java 8 新特性之方法引用Java
- 一文帶你認識Java8中介面的預設方法Java
- Java8新特性探索之Stream介面Java
- Java8新特性都到碗裡來Java
- 23.java介面預設方法和時間APIJavaAPI
- java8 新特性之方法引用Java
- java8 新特性之函式式介面Java函式
- 介面中的預設方法與靜態方法
- Java8新特性探索之函式式介面Java函式
- ABAP和Java裡關於DEFAULT(預設)機制的一些語言特性Java
- java 介面,介面的特性,介面實現多型,面向介面程式設計Java多型程式設計
- Java 8中Lambda表示式預設方法的模板方法模式,你夠了解麼?Java模式
- Java8 新特性,打破你對介面的認知Java
- Java8的新特性Java
- Java 8 新特性Java
- Java 8 新特性Java
- java8的新特性之lambda表示式和方法引用Java
- Java8新特性-四大核心函式式介面Java函式
- Java8 新特性 —— Stream 流式程式設計Java程式設計
- ?Java8新特性之Lambda表示式,函式式介面,方法引用和default關鍵字Java函式
- java 8 特性——stream流Java
- Java 8 新特性 StreamJava
- JAVA8新特性Java
- Java8 新特性Java
- 《Java8實戰》-第九章筆記(預設方法)Java筆記
- java8預設使用的垃圾收集器Java
- win10預設程式怎麼設定介面_win10設定預設程式的方法Win10
- Java8新特性 - LambdaJava
- Java 8 新特性---Optional類Java
- JAVA8新特性用法Java