Mientras buscaba en la Especificación del lenguaje Java para responder a esta pregunta , aprendí que
Antes de que se inicialice una clase, se debe inicializar su superclase directa, pero las interfaces implementadas por la clase no se inicializan. De manera similar, las superinterfaces de una interfaz no se inicializan antes de que se inicialice la interfaz.
Por mi propia curiosidad, lo probé y, como esperaba, la interfaz InterfaceType
no se inicializó.
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();
}
Este programa imprime
implemented method
Sin embargo, si la interfaz declara un default
método, se produce la inicialización. Considere la InterfaceType
interfaz dada como
interface InterfaceType {
public static final ClassInitializer init = new ClassInitializer();
public default void method() {
System.out.println("default method");
}
}
entonces el mismo programa anterior imprimiría
static initializer
implemented method
En otras palabras, static
se inicializa el campo de la interfaz ( paso 9 en el Procedimiento de inicialización detallado ) y static
se ejecuta el inicializador del tipo que se está inicializando. Esto significa que se inicializó la interfaz.
No pude encontrar nada en el JLS que indique que esto debería suceder. No me malinterpretes, entiendo que esto debería suceder en caso de que la clase de implementación no proporcione una implementación para el método, pero ¿y si lo hace? ¿Falta esta condición en la Especificación del lenguaje Java, me perdí algo o lo estoy interpretando incorrectamente?