English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
До Java 8 интерфейсы могли иметь константы и абстрактные методы.
Мы не можем предоставлять реализацию методов в интерфейсах. Если мы хотим предоставить комбинацию абстрактных и неабстрактных методов (методы с реализацией), то нам нужно использовать абстрактный класс.
public class Tester { 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("Открыть соединение с базой данных"); } @Override public void closeConnection() { System.out.println("Закрыть соединение с базой данных"); } } 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("Открыть соединение с базой данных"); } @Override public void closeConnection() { System.out.println("Закрыть соединение с базой данных"); } } 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(); }
Выполнение примера выводит результат:
Открыть соединение с базой данных Запись сообщения: Информация Закрыть соединение с базой данных Открыть соединение с базой данных Запись сообщения: Предупреждение Закрыть соединение с базой данных Открыть соединение с базой данных Запись сообщения: Ошибка Закрыть соединение с базой данных Открыть соединение с базой данных Запись сообщения: Катастрофическая Закрыть соединение с базой данных
В данном примере каждый метод логирования имеет свою реализацию.
В Java 8 интерфейсы получили новые возможности - методы по умолчанию и статические методы. Мы можем писать реализации методов в интерфейсах Java SE 8, используя ключевое слово default для их определения.
В Java 8 интерфейс может определять такие переменные/методы:
Константа
Абстрактный метод
Дефолтный метод
Статический метод
public class Tester { 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("Открыть соединение с базой данных"); } static void closeConnection() { System.out.println("Закрыть соединение с базой данных"); } }
Выполнение примера выводит результат:
Открыть соединение с базой данных Запись сообщения: Информация Закрыть соединение с базой данных Открыть соединение с базой данных Запись сообщения: Предупреждение Закрыть соединение с базой данных Открыть соединение с базой данных Запись сообщения: Ошибка Закрыть соединение с базой данных Открыть соединение с базой данных Запись сообщения: Катастрофическая Закрыть соединение с базой данных
Java 9 поддерживает как интерфейсные дефолтные методы, так и приватные методы, как и Java 8.
В Java 9 можно определить такие переменные/методы в интерфейсе, как:
Константа
Абстрактный метод
Дефолтный метод
Статический метод
Приватный метод
Приватный статический метод
В следующем примере избыточность была удалена в общие методы, что делает код明显 более простым:
public class Tester { 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, "Ошибка"); } default void logFatal(String message) { log(message, "Катастрофическая"); } private static void getConnection() { System.out.println("Открыть соединение с базой данных"); } private static void closeConnection() { System.out.println("Закрыть соединение с базой данных"); } }
Выполнение примера выводит результат:
Открыть соединение с базой данных Запись сообщения: Информация Закрыть соединение с базой данных Открыть соединение с базой данных Запись сообщения: Предупреждение Закрыть соединение с базой данных Открыть соединение с базой данных Запись сообщения: Ошибка Закрыть соединение с базой данных Открыть соединение с базой данных Запись сообщения: Катастрофическая Закрыть соединение с базой данных