Podczas przeszukiwania specyfikacji języka Java, aby odpowiedzieć na to pytanie , dowiedziałem się tego
Zanim klasa zostanie zainicjowana, jej bezpośrednia nadklasa musi zostać zainicjowana, ale interfejsy implementowane przez klasę nie są inicjowane. Podobnie, superinterfejsy interfejsu nie są inicjowane przed zainicjowaniem interfejsu.
Z własnej ciekawości spróbowałem i zgodnie z oczekiwaniami interfejs InterfaceType
nie został zainicjowany.
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();
}
Ten program drukuje
implemented method
Jeśli jednak interfejs deklaruje default
metodę, następuje inicjalizacja. Rozważmy InterfaceType
interfejs podany jako
interface InterfaceType {
public static final ClassInitializer init = new ClassInitializer();
public default void method() {
System.out.println("default method");
}
}
wydrukowałby ten sam program powyżej
static initializer
implemented method
Innymi słowy, static
pole interfejsu jest inicjalizowane ( krok 9 w szczegółowej procedurze inicjalizacji ) i wykonywany jest static
inicjalizator inicjalizowanego typu. Oznacza to, że interfejs został zainicjowany.
W JLS nie mogłem znaleźć niczego, co wskazywałoby na to, że to powinno się wydarzyć. Nie zrozum mnie źle, rozumiem, że powinno to mieć miejsce w przypadku, gdy klasa implementująca nie zapewnia implementacji metody, ale co, jeśli tak jest? Czy tego warunku brakuje w specyfikacji języka Java, czy coś przeoczyłem, czy też interpretuję to nieprawidłowo?