Під час пошуку специфікації мови 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, я щось пропустив, чи я неправильно його інтерпретую?
interface
в Java не слід визначати жодного конкретного методу. Тож я здивований, що InterfaceType
код склав.
default
методи .