Java 8 之前,介面好像只允許兩種類型的數據,一個是常數、另一個就是公開( public ) 的虛方法( abstract ),而且是虛方法哦,就是沒有任何實作的方法,因為這些方法要被類別來實作。也就是說,Java 8 之前的版本不存在有著預設實作的方法。
我們來看看一個範例,
public class InterfacePrivateMethodTester { public static void main(String []args) { LogOracle log = new LogOracle(); log.logInfo(""); log.logWarn(""); log.logError(""); log.logFatal(""); LogMySql log1 = new LogMySql(); log1.logInfo(""); log1.logWarn(""); log1.logError(""); log1.logFatal(""); } } final class LogOracle implements Logging { @Override public void logInfo(String message) { getConnection(); System.out.println("Log Message : " + "INFO"); closeConnection(); } @Override public void logWarn(String message) { getConnection(); System.out.println("Log Message : " + "WARN"); closeConnection(); } @Override public void logError(String message) { getConnection(); System.out.println("Log Message : " + "ERROR"); closeConnection(); } @Override public void logFatal(String message) { getConnection(); System.out.println("Log Message : " + "FATAL"); closeConnection(); } @Override public void getConnection() { System.out.println("Open Database connection"); } @Override public void closeConnection() { System.out.println("Close Database connection"); } } final class LogMySql implements Logging { @Override public void logInfo(String message) { getConnection(); System.out.println("Log Message : " + "INFO"); closeConnection(); } @Override public void logWarn(String message) { getConnection(); System.out.println("Log Message : " + "WARN"); closeConnection(); } @Override public void logError(String message) { getConnection(); System.out.println("Log Message : " + "ERROR"); closeConnection(); } @Override public void logFatal(String message) { getConnection(); System.out.println("Log Message : " + "FATAL"); closeConnection(); } @Override public void getConnection() { System.out.println("Open Database connection"); } @Override public void closeConnection() { System.out.println("Close Database connection"); } } interface Logging { String ORACLE = "Oracle_Database"; String MYSQL = "MySql_Database"; void logInfo(String message); void logWarn(String message); void logError(String message); void logFatal(String message); void getConnection(); void closeConnection(); }
運行結果如下
' #在這個實例中,每種類型的日誌都有自己的實作最坑的是什麼,每個方法都要實作一遍。是的,每個方法都要實現JDK 8版本而Java 8 也終於作出了一些改變,Java 8 中的接口,可以具有以下類型的變數和方法1、 常數$ javac InterfacePrivateMethodTester.java && java InterfacePrivateMethodTester
Open Database connection##LogLog Message : INFO
Close Database connection
Open Database connection
Log Message : WARN
Close Database connection
Open Database connection
Log Message : ERROR
Close Database connection## Open Database connection
Log Message : FATAL
Close Database connection
Open Database connection
Log Message : INFO
Close Database connection
Open Database connection##Log Message : #Close Database connection
Open Database connection
Log Message : ERROR
Close Database connection
Open Database connection
Log Message : FATAL
Close Database connection
Open Database connection2、 虛方法
3、 預設方法
4、靜態方法
我們將上面的範例改改,使用Java 8 的特性public class InterfacePrivateMethodTester { public static void main(String []args) { LogOracle log = new LogOracle(); log.logInfo(""); log.logWarn(""); log.logError(""); log.logFatal(""); LogMySql log1 = new LogMySql(); log1.logInfo(""); log1.logWarn(""); log1.logError(""); log1.logFatal(""); } } final class LogOracle implements Logging {} final class LogMySql implements Logging {} interface Logging { String ORACLE = "Oracle_Database"; String MYSQL = "MySql_Database"; default void logInfo(String message) { getConnection(); System.out.println("Log Message : " + "INFO"); closeConnection(); } default void logWarn(String message) { getConnection(); System.out.println("Log Message : " + "WARN"); closeConnection(); } default void logError(String message) { getConnection(); System.out.println("Log Message : " + "ERROR"); closeConnection(); } default void logFatal(String message) { getConnection(); System.out.println("Log Message : " + "FATAL"); closeConnection(); } static void getConnection() { System.out.println("Open Database connection"); } static void closeConnection() { System.out.println("Close Database connection"); } }
運行結果如下
$ javac InterfacePrivateMethodTester.java && java InterfacePrivateMethodTester
Open Database connection
Log Message : INFO##Close
Open Database connection
Log Message : INFO##Close
Open Database connection
Log Message : INFO##Close
Open Database connection
Log Message : INFO##Close Database connection
Open Database connection
Log Message : WARN
Close Database connection
Open Database connection
Log Message : ERRORClose Database connection
#Log Message : FATALClose Database connection
Open Database connection
Close Database connection
Open Database connectionLog Message : WARN
Close Database connection# Open Database connectionLog Message : ERROR
Close Database connectionOpen Database connection
Log Message : FATALClose Database connection
因為Java 8 的介面中的方法可以有預設實現,也就是使用default
關鍵字修飾的方法所以,類別實作某個介面就比較簡單了,可以有選擇性實作部分的方法。 但是,仍然很坑,就是每個預設方法中的程式碼,都必須完整的,而且不能呼叫其它的預設實作方法Java 9版本終於忍無可忍了,Java 9 中可以為接口提供私有的方法,包括私有成員方法和私有靜態方法所以Java 9 中的接口,可以具有以下類型的變數和方法
#1 , 常數2、 虛擬方法Close Database connection###Openbase connection# ##Log Message : INFO###Close Database connection###Open Database connection###Log Message : WARN###Close Database connection###Open Database connection###Log Message : ERROR###Close Data connection ###Open Database connection###Log Message : FATAL###Close Database connection######3、預設方法
#4、靜態方法
5、私有靜態方法
6 、 私有方法
於是,我們可以繼續修改剛剛的實例,改的更簡單明白些
InterfacePrivateMethodTester.javapublic class InterfacePrivateMethodTester { public static void main(String []args) { LogOracle log = new LogOracle(); log.logInfo(""); log.logWarn(""); log.logError(""); log.logFatal(""); LogMySql log1 = new LogMySql(); log1.logInfo(""); log1.logWarn(""); log1.logError(""); log1.logFatal(""); } } final class LogOracle implements Logging {} final class LogMySql implements Logging {} interface Logging { String ORACLE = "Oracle_Database"; String MYSQL = "MySql_Database"; private void log(String message, String prefix) { getConnection(); System.out.println("Log Message : " + prefix); closeConnection(); } default void logInfo(String message) { log(message, "INFO"); } default void logWarn(String message) { log(message, "WARN"); } default void logError(String message) { log(message, "ERROR"); } default void logFatal(String message) { log(message, "FATAL"); } private static void getConnection() { System.out.println("Open Database connection"); } private static void closeConnection() { System.out.println("Close Database connection"); } }
運行結果如下
$ javac InterfacePrivateMethodTester.java && java InterfacePrivateMethodTester
Open Database connection
Log Message : INFO
Close Data ##Close Database connection
Open Database connection
Log Message : ERROR
Close Database connection
Open Database connectionLog Message : FATAL
以上是Java9中介面的私有方法怎麼使用的詳細內容。更多資訊請關注PHP中文網其他相關文章!