Durante la ricerca attraverso il linguaggio Java Specification per rispondere a questa domanda , ho imparato che
Prima che una classe venga inizializzata, la sua superclasse diretta deve essere inizializzata, ma le interfacce implementate dalla classe non vengono inizializzate. Allo stesso modo, le superinterfacce di un'interfaccia non vengono inizializzate prima che l'interfaccia sia inizializzata.
Per mia curiosità, l'ho provato e, come previsto, l'interfaccia InterfaceType
non è stata inizializzata.
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();
}
Questo programma stampa
implemented method
Tuttavia, se l'interfaccia dichiara un default
metodo, viene eseguita l'inizializzazione. Considera l' InterfaceType
interfaccia data come
interface InterfaceType {
public static final ClassInitializer init = new ClassInitializer();
public default void method() {
System.out.println("default method");
}
}
quindi lo stesso programma sopra verrà stampato
static initializer
implemented method
In altre parole, il static
campo dell'interfaccia viene inizializzato ( passaggio 9 nella procedura di inizializzazione dettagliata ) e static
viene eseguito l' inizializzatore del tipo da inizializzare. Ciò significa che l'interfaccia è stata inizializzata.
Non sono riuscito a trovare nulla nel JLS per indicare che ciò dovrebbe accadere. Non fraintendetemi, capisco che ciò dovrebbe accadere nel caso in cui la classe di implementazione non fornisca un'implementazione per il metodo, ma cosa succede se lo fa? Questa condizione manca nelle specifiche del linguaggio Java, mi sono perso qualcosa o lo sto interpretando in modo errato?
interface
in Java non si debba definire alcun metodo concreto. Quindi sono sorpreso che il InterfaceType
codice sia stato compilato.
default
metodi .