English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
En Java 8Antes, el interfaz podía tener variables de constante y métodos abstractos.
No podemos proporcionar una implementación de métodos en el interfaz. Si queremos proporcionar una combinación de métodos abstractos y no abstractos (métodos con implementación), entonces debemos usar una clase abstracta.
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("Abrir conexión de base de datos"); } @Override public void closeConnection() { System.out.println("Cerrar conexión de base de datos"); } } 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("Abrir conexión de base de datos"); } @Override public void closeConnection() { System.out.println("Cerrar conexión de base de datos"); } } 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(); }
El resultado de ejecutar el ejemplo anterior es:
Abrir conexión de base de datos Mensaje de registro: INFO Cerrar conexión de base de datos Abrir conexión de base de datos Mensaje de registro: WARN Cerrar conexión de base de datos Abrir conexión de base de datos Mensaje de registro: ERROR Cerrar conexión de base de datos Abrir conexión de base de datos Mensaje de registro: FATAL Cerrar conexión de base de datos
En el ejemplo anterior, cada método de registro tiene su propia implementación.
En Java 8 El interfaz introduce algunas nuevas características: métodos por defecto y métodos estáticos. Podemos usarlos en Java SE 8El método de implementación se escribe en el interfaz, solo se necesita usar la palabra clave default para definirlos.
En Java 8 En una interfaz se pueden definir varios tipos de variables como se muestra a continuación/Método:
Constante
Método abstracto
Método por defecto
Método estático
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("Abrir conexión de base de datos"); } static void closeConnection() { System.out.println("Cerrar conexión de base de datos"); } }
El resultado de ejecutar el ejemplo anterior es:
Abrir conexión de base de datos Mensaje de registro: INFO Cerrar conexión de base de datos Abrir conexión de base de datos Mensaje de registro: WARN Cerrar conexión de base de datos Abrir conexión de base de datos Mensaje de registro: ERROR Cerrar conexión de base de datos Abrir conexión de base de datos Mensaje de registro: FATAL Cerrar conexión de base de datos
Java 9 No solo como Java 8 además de soportar métodos de interfaz por defecto, también admite métodos privados.
En Java 9 En una interfaz se pueden definir varios tipos de variables como se muestra a continuación/Método:
Constante
Método abstracto
Método por defecto
Método estático
Método privado
Método estático privado
El siguiente ejemplo extrae redundancias a métodos genéricos, lo que parece más conciso:
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, "ERROR"); } default void logFatal(String message) { log(message, "FATAL"); } private static void getConnection() { System.out.println("Abrir conexión de base de datos"); } private static void closeConnection() { System.out.println("Cerrar conexión de base de datos"); } }
El resultado de ejecutar el ejemplo anterior es:
Abrir conexión de base de datos Mensaje de registro: INFO Cerrar conexión de base de datos Abrir conexión de base de datos Mensaje de registro: WARN Cerrar conexión de base de datos Abrir conexión de base de datos Mensaje de registro: ERROR Cerrar conexión de base de datos Abrir conexión de base de datos Mensaje de registro: FATAL Cerrar conexión de base de datos