Lors de la recherche par le biais de la Java Langage de Spécification pour répondre à cette question, j'ai appris que
Devant une classe est initialisée, sa super-classe directe doit être initialisé, mais les interfaces implémentées par la classe ne sont pas initialisé. De même, la superinterfaces d'une interface sont pas initialisé avant que l'interface est initialisé.
Pour ma propre curiosité, j'ai essayé et, vraiment, l'interface InterfaceType
n'a pas été initialisé
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
Toutefois, si l'interface déclare default
méthode, puis l'initialisation se produit. Envisager l' InterfaceType
interface étant donné que
interface InterfaceType {
public static final ClassInitializer init = new ClassInitializer();
public default void method() {
System.out.println("default method");
}
}
puis le même programme ci-dessus serait d'imprimer
static initializer
implemented method
En d'autres termes, l' static
domaine de l'interface est initialisé (étape 9 dans la Procédure d'Initialisation) et l' static
de l'initialiseur de type en cours d'initialisation est exécutée. Cela signifie que l'interface a été initialisé.
Je ne pouvais pas trouver quoi que ce soit dans le JLS pour indiquer que ce qui doit arriver. Ne vous méprenez pas, je comprends que cela doit se faire dans le cas où la mise en œuvre de la classe n'est pas de fournir une implémentation de la méthode, mais si ce n'? Est-ce la condition manquante à partir de la Java Language Specification, j'ai oublié quelque chose, ou suis-je en l'interprétant à tort?