Java 8 介面裡的預設方法特性

bluetooth發表於2021-09-09

這篇文章我們將要探討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/,如需轉載,請註明出處,否則將追究法律責任。

相關文章