Avant Java 8, l'interface semble n'autoriser que deux types de données, l'une est une constante, l'autre est une méthode virtuelle publique (publique) (abstraite), et c'est une méthode virtuelle, mais il n'y a pas d'implémentation de méthodes, car ces méthodes doivent être implémentées par la classe. En d’autres termes, il n’existe aucune méthode avec implémentation par défaut dans les versions antérieures à Java 8.
Jetons un coup d'œil à un exemple,
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(); }
Le résultat en cours d'exécution est le suivant
$ javac InterfacePrivateMethodTester.java && java InterfacePrivateMethodTester
Ouvrir la connexion à la base de données
Message du journal : INFO
Fermer la connexion à la base de données
Ouvrir la connexion à la base de données
Message du journal : WARN
Fermer la connexion à la base de données
Ouvrir la connexion à la base de données
Message du journal : ERREUR
Fermer la connexion à la base de données
Ouvrir la connexion à la base de données
Message du journal : FATAL
Fermer la connexion à la base de données
Ouvrir la connexion à la base de données
Message du journal : INFO
Fermer la connexion à la base de données
Ouvrir la connexion à la base de données
Message du journal : WARN
Fermer la connexion à la base de données
Ouvrir la connexion à la base de données
Message du journal : ERREUR
Fermer la connexion à la base de données
Ouvrir la connexion à la base de données
Message du journal : FATAL
Fermer la connexion à la base de données
Dans ce cas, chaque type de journal a sa propre implémentation
Quel est le plus gros écueil ? Chaque méthode doit être à nouveau mise en œuvre. Oui, chaque méthode doit être implémentée
Et Java 8 a finalement apporté quelques modifications. L'interface de Java 8 peut avoir les types de variables et de méthodes suivants
1 Constantes
Méthode virtuelle
. 3, Méthode par défaut
4, Méthode statique
Nous modifions l'exemple ci-dessus et utilisons les fonctionnalités de 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"); } }
Les résultats d'exécution sont les suivants
$ javac InterfacePrivateMethodTester.java && java InterfacePrivateMethodTester
Connexion à la base de données ouverte
Journal Message : INFO
Fermer la connexion à la base de données
Ouvrir la connexion à la base de données
Message du journal : WARN
Fermer la connexion à la base de données
Ouvrir la connexion à la base de données
Message du journal : ERREUR
Fermer la connexion à la base de données
Ouvrir la connexion à la base de données
Message du journal : FATAL
Fermer la connexion à la base de données
Ouvrir la connexion à la base de données
Message du journal : INFO
Fermer la connexion à la base de données
Ouvrir la connexion à la base de données
Message du journal : WARN
Fermer la connexion à la base de données
Ouvrir la connexion à la base de données
Message du journal : ERREUR
Fermer la connexion à la base de données
Ouvrir la connexion à la base de données
Message du journal : FATAL
Fermer la connexion à la base de données
Parce que les méthodes dans les interfaces Java 8 peuvent avoir des implémentations par défaut, c'est-à-dire des méthodes modifiées avec des default
mots-clés
Il est donc relativement simple pour une classe d'implémenter une certaine interface, et certaines méthodes peuvent être implémentées de manière sélective.
Cependant, cela reste très déroutant, c'est-à-dire que le code de chaque méthode par défaut doit être complet et que les autres méthodes d'implémentation par défaut ne peuvent pas être appelées
Enfin, je n'en peux plus. Java 9, des interfaces privées peuvent être fournies comme méthodes, y compris des méthodes membres privées et des méthodes statiques privées
Ainsi, les interfaces dans Java 9 peuvent avoir les types de variables et de méthodes suivants
1 Constantes
2. méthodes
4. Méthodes statiques
5. Méthode statique privée
6. Méthode privée
Donc, nous pouvons continuer à modifier l'instance tout à l'heure, la rendant plus simple et plus claire
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");
}
}
Le les résultats en cours d'exécution sont les suivants
Ouvrir la connexion à la base de donnéesMessage du journal : INFO
Fermer la connexion à la base de données
Ouvrir la connexion à la base de données
Message du journal : WARN
Fermer la connexion à la base de données
Ouvrir la connexion à la base de données
Message du journal : ERREUR
Fermer la connexion à la base de données
Ouvrir la connexion à la base de données
Message du journal : FATAL
Fermer la connexion à la base de données
Ouvrir la connexion à la base de données
Message du journal : INFO
Fermer la connexion à la base de données
Ouvrir la connexion à la base de données
Message du journal : WARN
Fermer la connexion à la base de données
Ouvrir la connexion à la base de données
Journal Message : ERREUR
Fermer la connexion à la base de données
Ouvrir la connexion à la base de données
Message du journal : FATAL
Fermer la connexion à la base de données
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!