Je sais qu’une interface est comme une classe abstraite 100% pure. Donc, il ne peut pas y avoir d’implémentation de méthode. Mais j’ai vu un code étrange. Quelqu’un peut-il l’expliquer?
Extrait de code:
interface Whoa { public static void doStuff() { System.out.println("This is not default implementation"); } }
MODIFIER:
Mon IDE est Intellij Idea 13.1. Le SDK du projet est java 7 . L’EDI ne montre aucune erreur de compilation. Mais, lorsque je comstack le code en ligne de commande, je reçois le message suivant.
Whoa.java:2: error: modifier static not allowed here public static void doStuff() { ^
A partir de Java 8, vous pouvez définir des méthodes statiques dans les interfaces en plus des méthodes par défaut.
Une méthode statique est une méthode associée à la classe dans laquelle elle est définie et non à un object. Chaque instance de la classe partage ses méthodes statiques.
Cela facilite l’organisation des méthodes d’assistance dans vos bibliothèques. Vous pouvez conserver des méthodes statiques spécifiques à une interface dans la même interface plutôt que dans une classe distincte.
L’exemple suivant définit une méthode statique qui récupère un object ZoneId
correspondant à un identificateur de fuseau horaire; il utilise le fuseau horaire par défaut du système s’il n’y a pas d’object ZoneId
correspondant à l’identifiant donné. (En conséquence, vous pouvez simplifier la méthode getZonedDateTime
)
Voici le code:
public interface TimeClient { // ... static public ZoneId getZoneId (Ssortingng zoneSsortingng) { try { return ZoneId.of(zoneSsortingng); } catch (DateTimeException e) { System.err.println("Invalid time zone: " + zoneSsortingng +"; using default time zone instead."); return ZoneId.systemDefault(); } } default public ZonedDateTime getZonedDateTime(Ssortingng zoneSsortingng) { return ZonedDateTime.of(getLocalDateTime(), getZoneId(zoneSsortingng)); } }
Oracle docs pour les méthodes d’interface
Pour tout ce qui est intéressant en Java 8, lisez Tout sur Java 8
Ceci n’est possible qu’en Java 8. Dans la spécification de langage Java 7 §9.4 , il est explicitement indiqué:
C’est une erreur de compilation si une méthode déclarée dans une interface est déclarée statique, car les méthodes statiques ne peuvent pas être abstraites.
Donc, dans Java 7, les méthodes statiques dans les interfaces ne peuvent pas exister.
Si vous allez à la spécification de langage Java 8 §9.4.3 , vous pouvez voir que cela dit:
Une méthode statique a également un corps de bloc, qui fournit l’implémentation de la méthode.
Donc, il est explicitement dit que dans Java 8, ils peuvent exister.
J’ai même essayé d’exécuter votre code exact en Java 1.7.0_45, mais cela m’a donné l’erreur “modificateur statique non autorisé ici”.
Voici un extrait du tutoriel Java 8 , Méthodes par défaut (apprentissage du langage Java> Interfaces et inheritance) :
Méthodes statiques
Outre les méthodes par défaut, vous pouvez définir des méthodes statiques dans les interfaces. (Une méthode statique est une méthode associée à la classe dans laquelle elle est définie et non à un object. Chaque instance de la classe partage ses méthodes statiques.) Cela facilite l’organisation des méthodes d’assistance dans vos bibliothèques. Vous pouvez conserver des méthodes statiques spécifiques à une interface dans la même interface plutôt que dans une classe distincte. L’exemple suivant définit une méthode statique qui récupère un object
ZoneId
correspondant à un identificateur de fuseau horaire; il utilise le fuseau horaire par défaut du système s’il n’y a pas d’objectZoneId
correspondant à l’identifiant donné. (Par conséquent, vous pouvez simplifier la méthodegetZonedDateTime
):public interface TimeClient { // ... static public ZoneId getZoneId (Ssortingng zoneSsortingng) { try { return ZoneId.of(zoneSsortingng); } catch (DateTimeException e) { System.err.println("Invalid time zone: " + zoneSsortingng + "; using default time zone instead."); return ZoneId.systemDefault(); } } default public ZonedDateTime getZonedDateTime(Ssortingng zoneSsortingng) { return ZonedDateTime.of(getLocalDateTime(), getZoneId(zoneSsortingng)); } }
Comme les méthodes statiques dans les classes, vous spécifiez qu’une définition de méthode dans une interface est une méthode statique avec le mot-clé
static
au début de la signature de la méthode. Toutes les déclarations de méthode dans une interface, y compris les méthodes statiques, sont implicitementpublic
, vous pouvez donc omettre le modificateurpublic
.
Pour Java version 7 ou inférieure , une fonction similaire peut être obtenue en utilisant une classe nestede déclarée dans le corps de l’interface. et cette classe nestede implémente une interface externe.
interface I1{ public void doSmth(); class DefaultRealizationClass implements I1{ @Override public void doSmth() { System.out.println("default realization"); } } }
class MyClass implements I1{ @Override public void doSmth() { new I1.DefaultRealizationClass().doSmth(); } }
Par conséquent, l’implémentation par défaut est encapsulée dans l’interface.