Sementara mencari melalui Java Language Specification untuk menjawab pertanyaan ini , saya belajar bahwa
Sebelum kelas diinisialisasi, superclass langsungnya harus diinisialisasi, tetapi antarmuka yang diimplementasikan oleh kelas tersebut tidak diinisialisasi. Demikian pula, superinterfaces dari sebuah antarmuka tidak diinisialisasi sebelum antarmuka diinisialisasi.
Untuk rasa ingin tahu saya sendiri, saya mencobanya dan, seperti yang diharapkan, antarmuka InterfaceType
tidak diinisialisasi.
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();
}
Program ini mencetak
implemented method
Namun, jika antarmuka mendeklarasikan default
metode, maka inisialisasi memang terjadi. Pertimbangkan InterfaceType
antarmuka yang diberikan sebagai
interface InterfaceType {
public static final ClassInitializer init = new ClassInitializer();
public default void method() {
System.out.println("default method");
}
}
maka program yang sama di atas akan dicetak
static initializer
implemented method
Dengan kata lain, static
bidang antarmuka diinisialisasi ( langkah 9 dalam Prosedur Inisialisasi Terperinci ) dan static
penginisialisasi jenis yang diinisialisasi dijalankan. Ini berarti antarmuka telah diinisialisasi.
Saya tidak dapat menemukan apa pun di JLS yang menunjukkan bahwa ini harus terjadi. Jangan salah paham, saya mengerti bahwa hal ini harus terjadi jika kelas pelaksana tidak menyediakan implementasi untuk metode tersebut, tetapi bagaimana jika demikian? Apakah kondisi ini hilang dari Spesifikasi Bahasa Java, apakah saya melewatkan sesuatu, atau saya salah menafsirkannya?