Під час пошуку специфікації мови 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методи .