La méthode statique d'interface Java 1.8 est visible uniquement pour les méthodes d'interface, si nous supprimons la méthodeSta1() de la classe InterfaceExample, nous ne pourrons pas l'utiliser pour l'objet InterfaceExample. Cependant, comme d'autres méthodes statiques, nous pouvons utiliser les méthodes statiques d'interface en utilisant le nom de la classe. Par exemple, une instruction valide sera : exp1.methodSta1();
Ainsi, après avoir examiné l'exemple ci-dessous, nous pouvons dire : 1) La méthode statique d'interface Java fait partie de l'interface, nous ne pouvons pas l'utiliser pour les objets de la classe d'implémentation.
2) Les méthodes statiques d'interface Java sont bonnes pour fournir des méthodes utilitaires, par exemple la vérification de null, le tri de collections, le journal, etc.
3) La méthode statique d'interface Java nous aide à fournir une sécurité en empêchant les classes d'implémentation (InterfaceExample) de les remplacer.
4) Nous ne pouvons pas définir de méthode statique d'interface pour les méthodes de la classe Object, nous obtiendrons une erreur de compilation indiquant "Cette méthode statique ne peut pas masquer la méthode d'instance de Object". Cela n'est pas autorisé en Java, car Object est la classe de base pour toutes les classes et nous ne pouvons pas avoir une méthode statique au niveau de la classe et une autre méthode d'instance de même signature.
5) Nous pouvons utiliser les méthodes statiques d'interface Java pour supprimer les classes utilitaires telles que Collections et déplacer toutes ses méthodes statiques vers l'interface correspondante, ce qui serait facile à trouver et à utiliser.
public class InterfaceExample implements exp1 {
@Override
public void method() {
System.out.println("From method()");
}
public static void main(String[] args) {
new InterfaceExample().method2();
InterfaceExample.methodSta2(); // <--------------------------- ne compilerait pas
// methodSta1(); // <--------------------------- ne compilerait pas
exp1.methodSta1();
}
static void methodSta2() { // <-- compile avec succès mais ne peut pas être redéfini dans les classes enfants
System.out.println("========= InterfaceExample :: de methodSta2() ======");
}
}
interface exp1 {
void method();
//protected void method1(); // <-- erreur
//private void method2(); // <-- erreur
//static void methodSta1(); // <-- erreur nécessite un corps en Java 1.8
static void methodSta1() { // <-- compile avec succès mais ne peut pas être redéfini dans les classes enfants
System.out.println("========= exp1:: de methodSta1() ======");
}
static void methodSta2() { // <-- compile avec succès mais ne peut pas être redéfini dans les classes enfants
System.out.println("========= exp1:: de methodSta2() ======");
}
default void method2() { System.out.println("--- exp1:: de method2() ---");}
//synchronized default void method3() { System.out.println("---");} // <-- Modificateur non valide pour la méthode d'interface method3; seuls sont permis public, abstract, default, static
// et strictfp
//final default void method3() { System.out.println("---");} // <-- erreur
}
0 votes
Les champs sont définis alors que la méthode n'a pas de corps. Tenter d'appeler la méthode provoquera une erreur, tandis que les variables seront toujours présentes : qu'elles soient par défaut ou définies.
1 votes
bugs.sun.com/view_bug.do?bug_id=4093687 - fermé ne sera pas fixé avec plus de 200 votes, et c'était en 1997...
0 votes
@erickson - pourquoi dis-tu que c'est une réponse échouant à une interview ?
0 votes
@BoratSagdiyev Je ne le fais pas; c'était une réponse à un commentaire qui a été supprimé maintenant.