대답 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
메소드를 허용 합니다 .