Java 8 介面裡的預設方法特性
這篇文章我們將要探討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 */@Overridepublic void openTheBook() { System.out.println("The Java book is opened"); }/** * This reads the book */@Overridepublic 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 */@Overridepublic void openTheBook() { System.out.println("The Java book is opened"); }/** * This reads the book */@Overridepublic 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 */@Overridepublic void openTheBook() { System.out.println("The Java book is opened"); }/** * This reads the book */@Overridepublic 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(); } }
更深入的瞭解閱讀,可以參考下面的連結:
譯文連結:
英文原文:
翻譯作者: – civic5216
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/3402/viewspace-2810137/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Java8 新特性之預設介面方法Java
- Java8新特性第2章(介面預設方法)Java
- java8 新特性之預設方法Java
- 【Java8新特性】介面中的預設方法和靜態方法,你都掌握了嗎?Java
- java8介面的靜態方法和預設方法Java
- C# 8: 預設介面方法C#
- java8新特性之函式式介面、lambda表示式、介面的預設方法、方法和建構函式的引用Java函式
- Java8 預設方法Java
- java8特性-函式式介面Java函式
- Java8的新特性--函式式介面Java函式
- java 8裡 Method方法bugJava
- Java8新特性都到碗裡來Java
- 一文帶你認識Java8中介面的預設方法Java
- Java 8 新特性之方法引用Java
- Java8新特性探索之Stream介面Java
- Java8 新特性(一)- 介面增強Java
- 23.java介面預設方法和時間APIJavaAPI
- Java 8 預設方法和多繼承深入解析Java繼承
- 介面中的預設方法與靜態方法
- java8 新特性之函式式介面Java函式
- java8 新特性之方法引用Java
- ABAP和Java裡關於DEFAULT(預設)機制的一些語言特性Java
- Java8新特性探索之函式式介面Java函式
- Java 8中Lambda表示式預設方法的模板方法模式,你夠了解麼?Java模式
- java 介面,介面的特性,介面實現多型,面向介面程式設計Java多型程式設計
- Java 8預設方法會破壞你的(使用者的)程式碼Java
- Java8 新特性,打破你對介面的認知Java
- Java8的新特性Java
- Java 8 新特性Java
- Java 8 新特性Java
- Java 8新特性Java
- 請問如何在jbuilder8裡設計介面UI
- Java8新特性-四大核心函式式介面Java函式
- java8的新特性之lambda表示式和方法引用Java
- TestComplete 8 新特性 - 呼叫Java程式內部方法Java
- Java8 新特性 —— Stream 流式程式設計Java程式設計
- ?Java8新特性之Lambda表示式,函式式介面,方法引用和default關鍵字Java函式
- 《Java8實戰》-第九章筆記(預設方法)Java筆記