English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Em Java 8Antes, as interfaces podiam ter variáveis constantes e métodos abstratos.
Não podemos fornecer implementação de métodos em uma interface. Se precisarmos fornecer uma combinação de métodos abstratos e não abstratos (métodos com implementação), devemos usar uma classe abstrata.
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("Mensagem de Log: " + "INFO"); closeConnection(); } @Override public void logWarn(String message) { getConnection(); System.out.println("Mensagem de Log: " + "WARN"); closeConnection(); } @Override public void logError(String message) { getConnection(); System.out.println("Mensagem de Log: " + "ERROR"); closeConnection(); } @Override public void logFatal(String message) { getConnection(); System.out.println("Mensagem de Log: " + "FATAL"); closeConnection(); } @Override public void getConnection() { System.out.println("Abrir conexão de banco de dados"); } @Override public void closeConnection() { System.out.println("Fechar conexão de banco de dados"); } } final class LogMySql implements Logging { @Override public void logInfo(String message) { getConnection(); System.out.println("Mensagem de Log: " + "INFO"); closeConnection(); } @Override public void logWarn(String message) { getConnection(); System.out.println("Mensagem de Log: " + "WARN"); closeConnection(); } @Override public void logError(String message) { getConnection(); System.out.println("Mensagem de Log: " + "ERROR"); closeConnection(); } @Override public void logFatal(String message) { getConnection(); System.out.println("Mensagem de Log: " + "FATAL"); closeConnection(); } @Override public void getConnection() { System.out.println("Abrir conexão de banco de dados"); } @Override public void closeConnection() { System.out.println("Fechar conexão de banco de dados"); } } 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(); }
O resultado de execução do exemplo acima é:
Abrir conexão de banco de dados Mensagem de log: INFO Fechar conexão de banco de dados Abrir conexão de banco de dados Mensagem de log: WARN Fechar conexão de banco de dados Abrir conexão de banco de dados Mensagem de log: ERROR Fechar conexão de banco de dados Abrir conexão de banco de dados Mensagem de log: FATAL Fechar conexão de banco de dados
No exemplo acima, cada método de log tem sua própria implementação.
Em Java 8 A interface introduziu novas funcionalidades - métodos padrão e métodos estáticos. Podemos usar o Java SE 8A implementação dos métodos deve ser feita no arquivo de interface, usando apenas a palavra-chave default para defini-los.
Em Java 8 Em Java, uma interface pode definir os seguintes tipos de variáveis:/Método:
Constante
Método abstrato
Método padrão
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"; void default logInfo(String message) { getConnection(); System.out.println("Mensagem de Log: " + "INFO"); closeConnection(); } void default logWarn(String message) { getConnection(); System.out.println("Mensagem de Log: " + "WARN"); closeConnection(); } void default logError(String message) { getConnection(); System.out.println("Mensagem de Log: " + "ERROR"); closeConnection(); } void logFatal(String message) { getConnection(); System.out.println("Mensagem de Log: " + "FATAL"); closeConnection(); } static void getConnection() { System.out.println("Abrir conexão de banco de dados"); } static void closeConnection() { System.out.println("Fechar conexão de banco de dados"); } }
O resultado de execução do exemplo acima é:
Abrir conexão de banco de dados Mensagem de log: INFO Fechar conexão de banco de dados Abrir conexão de banco de dados Mensagem de log: WARN Fechar conexão de banco de dados Abrir conexão de banco de dados Mensagem de log: ERROR Fechar conexão de banco de dados Abrir conexão de banco de dados Mensagem de log: FATAL Fechar conexão de banco de dados
Java 9 Além do Java 8 Além de suportar métodos padrão de interface, também suporta métodos privados.
Em Java 9 Em Java, uma interface pode definir os seguintes tipos de variáveis:/Método:
Constante
Método abstrato
Método padrão
Método estático
Método privado
Método privado estático
A seguir, um exemplo que extraiu redundância para métodos genéricos, parece claramente mais 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("Mensagem de Log: " + prefix); closeConnection(); } void default logInfo(String message) { log(message, "INFO"); } void default logWarn(String message) { log(message, "WARN"); } void default logError(String message) { log(message, "ERROR"); } void logFatal(String message) { log(message, "FATAL"); } private static void getConnection() { System.out.println("Abrir conexão de banco de dados"); } private static void closeConnection() { System.out.println("Fechar conexão de banco de dados"); } }
O resultado de execução do exemplo acima é:
Abrir conexão de banco de dados Mensagem de log: INFO Fechar conexão de banco de dados Abrir conexão de banco de dados Mensagem de log: WARN Fechar conexão de banco de dados Abrir conexão de banco de dados Mensagem de log: ERROR Fechar conexão de banco de dados Abrir conexão de banco de dados Mensagem de log: FATAL Fechar conexão de banco de dados