Когда инициализируется интерфейс с методом по умолчанию?
При поиске через спецификацию языка Java, чтобы ответитьэтот вопрос, Я научилсятот
Прежде чем класс инициализируется, его прямой суперкласс должен быть инициализирован,но интерфейсы, реализованные классом, не инициализируются. Аналогично, суперинтерфейсы интерфейса не инициализируются до инициализации интерфейса.
Для собственного любопытства попробовал и, как и ожидалось, интерфейсInterfaceType
не был инициализирован.
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();
}
Эта программа печатает
implemented method
Однако, если интерфейс объявляетdefault
метод, то инициализация происходит. РассмотримInterfaceType
интерфейс дан как
interface InterfaceType {
public static final ClassInitializer init = new ClassInitializer();
public default void method() {
System.out.println("default method");
}
}
тогда та же самая программа выше напечатала бы
static initializer
implemented method
Другими словами,static
поле интерфейса инициализировано (шаг 9 в Подробной процедуре инициализации) иstatic
инициализатор инициализируемого типа выполняется. Это означает, что интерфейс был инициализирован.
Я не мог найти что-либо в JLS, чтобы указать, что это должно произойти. Не поймите меня неправильно, я понимаю, что это должно произойти в случае, если реализующий класс не предоставляет реализацию для метода, но что, если он это сделает? Это условие отсутствует в спецификации языка Java, я что-то упустил или неправильно его интерпретирую?