この質問に答えるために 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 言語仕様に欠けているのでしょうか、何か抜けているのでしょうか、それとも間違って解釈しているのでしょうか?