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");
}
}
EDIT:
Mon IDE est une idée d'Intellij 13.1. Le SDK du projet est Java 7 <1.7.0_25>. Le IDE n'est pas indiquant une erreur quelconque du compilateur. Mais, lorsque je compile le code en ligne de commande, le message suivant s'affiche.
Whoa.Java:2: error: modifier static not allowed here public static void doStuff() { ^
À 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 plutôt qu'à un objet. 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 séparée.
L'exemple suivant définit une méthode statique qui extrait un objet 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'objet 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 (String zoneString) {
try {
return ZoneId.of(zoneString);
} catch (DateTimeException e) {
System.err.println("Invalid time zone: " + zoneString +"; using default time zone instead.");
return ZoneId.systemDefault();
}
}
default public ZonedDateTime getZonedDateTime(String zoneString) {
return ZonedDateTime.of(getLocalDateTime(), getZoneId(zoneString));
}
}
Pour toutes les choses intéressantes dans Java 8 read ) Tout sur Java 8
Ceci n'est possible que dans Java 8. Dans le Java 7 Spécification du langage §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.
Ainsi, dans Java 7, les méthodes statiques dans les interfaces ne peuvent pas exister.
Si vous allez au Java 8 Spécification de langage §9.4. , vous pouvez voir qu'il est écrit:
Une méthode statique possède également un corps de bloc, qui fournit la mise en œuvre de la méthode.
Donc, il est explicitement indiqué que dans Java 8, ils peuvent exister.
J'ai même essayé d'exécuter votre code exact dans Java 1.7.0_45, mais cela m'a donné l'erreur "modificateur statique interdit ici".
Voici une citation directement tirée du tutoriel Java ) 8 , Méthodes par défaut (Apprentissage du Java Langage> Interfaces et héritage)) :
Méthodes statiques
En plus des méthodes par défaut, vous pouvez définir méthodes statiques dans les interfaces. (Une méthode statique est une méthode associée à la classe dans laquelle elle est définie plutôt qu'à un objet. Chaque instance de la classe partage ses méthodes statiques.) Cela vous permet d'organiser plus facilement 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 séparée. L'exemple suivant définit une méthode statique qui extrait un objet
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'objetZoneId
correspondant à l'identifiant donné. (En conséquence, vous pouvez simplifier la méthodegetZonedDateTime
):public interface TimeClient { // ... static public ZoneId getZoneId (String zoneString) { try { return ZoneId.of(zoneString); } catch (DateTimeException e) { System.err.println("Invalid time zone: " + zoneString + "; using default time zone instead."); return ZoneId.systemDefault(); } } default public ZonedDateTime getZonedDateTime(String zoneString) { return ZonedDateTime.of(getLocalDateTime(), getZoneId(zoneString)); } }
Comme pour 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 moins, vous pouvez obtenir une fonctionnalité similaire en utilisant une classe imbriquée déclarée dans le corps de l'interface. et cette classe imbriquée implémente l'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.