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 InterfaceType
n'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 default
méthode, l'initialisation se produit. Considérez l' InterfaceType
interface 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 static
champ de l'interface est initialisé ( étape 9 de la procédure d'initialisation détaillée ) et l' static
initialiseur 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?