En cherchant dans la spécification du langage Java pour répondre à cette question , j'ai appris que
Avant qu'une classe ne soit initialisée, sa superclasse directe doit être initialisée, mais les interfaces implémentées par la classe ne sont pas initialisées. De même, les superinterfaces d'une interface ne sont pas initialisées avant que l'interface ne soit initialisée.
Pour ma propre curiosité, je l'ai essayé et, comme prévu, l'interface InterfaceTypen'a pas été initialisée.
public class Example {
public static void main(String[] args) throws Exception {
InterfaceType foo = new InterfaceTypeImpl();
foo.method();
}
}
class InterfaceTypeImpl implements InterfaceType {
@Override
public void method() {
System.out.println("implemented method");
}
}
class ClassInitializer {
static {
System.out.println("static initializer");
}
}
interface InterfaceType {
public static final ClassInitializer init = new ClassInitializer();
public void method();
}
Ce programme imprime
implemented method
Cependant, si l'interface déclare une defaultméthode, l'initialisation se produit. Considérez l' InterfaceTypeinterface donnée comme
interface InterfaceType {
public static final ClassInitializer init = new ClassInitializer();
public default void method() {
System.out.println("default method");
}
}
alors le même programme ci-dessus imprimerait
static initializer
implemented method
En d'autres termes, le staticchamp de l'interface est initialisé ( étape 9 de la procédure d'initialisation détaillée ) et l' staticinitialiseur du type en cours d'initialisation est exécuté. Cela signifie que l'interface a été initialisée.
Je n'ai rien trouvé dans le JLS pour indiquer que cela devrait arriver. Ne vous méprenez pas, je comprends que cela devrait se produire au cas où la classe d'implémentation ne fournit pas d'implémentation pour la méthode, mais que se passe-t-il si c'est le cas? Cette condition est-elle absente de la spécification du langage Java, ai-je manqué quelque chose ou est-ce que je l'interprète mal?