Java9中接口的私有方法如何使用

其他教程   发布日期:2025年02月15日   浏览次数:189

本文小编为大家详细介绍“Java9中接口的私有方法如何使用”,内容详细,步骤清晰,细节处理妥当,希望这篇“Java9中接口的私有方法如何使用”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。

Java 8 之前版本

Java 8 之前 ,接口好像就只允许两种类型的数据,一个是常量、另一个就是公开 ( public ) 的虚方法 ( abstract ),而且是虚方法哦,就是没有任何实现的方法,因为这些方法要被类来实现。也就是说,Java 8 之前的版本不存在有着默认实现的方法。

我们来看看一个示例,

  1. public class InterfacePrivateMethodTester {
  2. public static void main(String []args) {
  3. LogOracle log = new LogOracle();
  4. log.logInfo("");
  5. log.logWarn("");
  6. log.logError("");
  7. log.logFatal("");
  8. LogMySql log1 = new LogMySql();
  9. log1.logInfo("");
  10. log1.logWarn("");
  11. log1.logError("");
  12. log1.logFatal("");
  13. }
  14. }
  15. final class LogOracle implements Logging {
  16. @Override
  17. public void logInfo(String message) {
  18. getConnection();
  19. System.out.println("Log Message : " + "INFO");
  20. closeConnection();
  21. }
  22. @Override
  23. public void logWarn(String message) {
  24. getConnection();
  25. System.out.println("Log Message : " + "WARN");
  26. closeConnection();
  27. }
  28. @Override
  29. public void logError(String message) {
  30. getConnection();
  31. System.out.println("Log Message : " + "ERROR");
  32. closeConnection();
  33. }
  34. @Override
  35. public void logFatal(String message) {
  36. getConnection();
  37. System.out.println("Log Message : " + "FATAL");
  38. closeConnection();
  39. }
  40. @Override
  41. public void getConnection() {
  42. System.out.println("Open Database connection");
  43. }
  44. @Override
  45. public void closeConnection() {
  46. System.out.println("Close Database connection");
  47. }
  48. }
  49. final class LogMySql implements Logging {
  50. @Override
  51. public void logInfo(String message) {
  52. getConnection();
  53. System.out.println("Log Message : " + "INFO");
  54. closeConnection();
  55. }
  56. @Override
  57. public void logWarn(String message) {
  58. getConnection();
  59. System.out.println("Log Message : " + "WARN");
  60. closeConnection();
  61. }
  62. @Override
  63. public void logError(String message) {
  64. getConnection();
  65. System.out.println("Log Message : " + "ERROR");
  66. closeConnection();
  67. }
  68. @Override
  69. public void logFatal(String message) {
  70. getConnection();
  71. System.out.println("Log Message : " + "FATAL");
  72. closeConnection();
  73. }
  74. @Override
  75. public void getConnection() {
  76. System.out.println("Open Database connection");
  77. }
  78. @Override
  79. public void closeConnection() {
  80. System.out.println("Close Database connection");
  81. }
  82. }
  83. interface Logging {
  84. String ORACLE = "Oracle_Database";
  85. String MYSQL = "MySql_Database";
  86. void logInfo(String message);
  87. void logWarn(String message);
  88. void logError(String message);
  89. void logFatal(String message);
  90. void getConnection();
  91. void closeConnection();
  92. }

运行结果如下

$ javac InterfacePrivateMethodTester.java && java InterfacePrivateMethodTester
Open Database connection
Log 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 : WARN
Close Database connection
Open Database connection
Log Message : ERROR
Close Database connection
Open Database connection
Log Message : FATAL
Close Database connection

在这个实例中,每种类型的日志都有自己的实现

最坑的是什么,每个方法都要实现一遍。是的,每个方法都要实现

JDK 8版本

而 Java 8 也终于作出了一些改变,Java 8 中的接口,可以具有以下类型的变量和方法

1、 常量

2、 虚方法

3、 默认方法

4、 静态方法

我们将上面的范例改改,使用 Java 8 的特性

  1. public class InterfacePrivateMethodTester {
  2. public static void main(String []args) {
  3. LogOracle log = new LogOracle();
  4. log.logInfo("");
  5. log.logWarn("");
  6. log.logError("");
  7. log.logFatal("");
  8. LogMySql log1 = new LogMySql();
  9. log1.logInfo("");
  10. log1.logWarn("");
  11. log1.logError("");
  12. log1.logFatal("");
  13. }
  14. }
  15. final class LogOracle implements Logging {}
  16. final class LogMySql implements Logging {}
  17. interface Logging {
  18. String ORACLE = "Oracle_Database";
  19. String MYSQL = "MySql_Database";
  20. default void logInfo(String message) {
  21. getConnection();
  22. System.out.println("Log Message : " + "INFO");
  23. closeConnection();
  24. }
  25. default void logWarn(String message) {
  26. getConnection();
  27. System.out.println("Log Message : " + "WARN");
  28. closeConnection();
  29. }
  30. default void logError(String message) {
  31. getConnection();
  32. System.out.println("Log Message : " + "ERROR");
  33. closeConnection();
  34. }
  35. default void logFatal(String message) {
  36. getConnection();
  37. System.out.println("Log Message : " + "FATAL");
  38. closeConnection();
  39. }
  40. static void getConnection() {
  41. System.out.println("Open Database connection");
  42. }
  43. static void closeConnection() {
  44. System.out.println("Close Database connection");
  45. }
  46. }

运行结果如下

$ javac InterfacePrivateMethodTester.java && java InterfacePrivateMethodTester
Open Database connection
Log 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 : WARN
Close Database connection
Open Database connection
Log Message : ERROR
Close Database connection
Open Database connection
Log Message : FATAL
Close Database connection

因为 Java 8 的接口中的方法可以有默认实现,也就是使用

  1. default
关键字修饰的方法

所以,类实现某个接口就比较简单了,可以有选择性的实现部分方法。

但是,仍然很坑,就是每个默认方法中的代码,都必须完整的,而且不能调用其它的默认实现方法

Java 9版本

终于忍无可忍了,Java 9 中可以为接口提供私有的方法,包括私有成员方法和私有静态方法

所以 Java 9 中的接口,可以具有以下类型的变量和方法

1、 常量

2、 虚方法

3、 默认方法

4、 静态方法

5、 私有静态方法

6、 私有方法

于是,我们可以继续修改刚刚的实例,改的更简单明白些

InterfacePrivateMethodTester.java

  1. public class InterfacePrivateMethodTester {
  2. public static void main(String []args) {
  3. LogOracle log = new LogOracle();
  4. log.logInfo("");
  5. log.logWarn("");
  6. log.logError("");
  7. log.logFatal("");
  8. LogMySql log1 = new LogMySql();
  9. log1.logInfo("");
  10. log1.logWarn("");
  11. log1.logError("");
  12. log1.logFatal("");
  13. }
  14. }
  15. final class LogOracle implements Logging {}
  16. final class LogMySql implements Logging {}
  17. interface Logging {
  18. String ORACLE = "Oracle_Database";
  19. String MYSQL = "MySql_Database";
  20. private void log(String message, String prefix) {
  21. getConnection();
  22. System.out.println("Log Message : " + prefix);
  23. closeConnection();
  24. }
  25. default void logInfo(String message) {
  26. log(message, "INFO");
  27. }
  28. default void logWarn(String message) {
  29. log(message, "WARN");
  30. }
  31. default void logError(String message) {
  32. log(message, "ERROR");
  33. }
  34. default void logFatal(String message) {
  35. log(message, "FATAL");
  36. }
  37. private static void getConnection() {
  38. System.out.println("Open Database connection");
  39. }
  40. private static void closeConnection() {
  41. System.out.println("Close Database connection");
  42. }
  43. }

运行结果如下

$ javac InterfacePrivateMethodTester.java && java InterfacePrivateMethodTester
Open Database connection
Log 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 : WARN
Close Database connection
Open Database connection
Log Message : ERROR
Close Database connection
Open Database connection
Log Message : FATAL
Close Database connection

以上就是Java9中接口的私有方法如何使用的详细内容,更多关于Java9中接口的私有方法如何使用的资料请关注九品源码其它相关文章!