Cevaplamak için Java Dil Şartnamede arama yaparken bu soruyu , ben öğrendim o
Bir sınıf başlatılmadan önce, onun doğrudan üst sınıfı başlatılmalıdır, ancak sınıf tarafından uygulanan arabirimler başlatılmaz. Benzer şekilde, bir arayüzün süper arayüzleri, arayüz başlatılmadan önce başlatılmaz.
Kendi merakım için denedim ve beklendiği gibi arayüz InterfaceType
başlatılmadı.
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();
}
Bu program yazdırır
implemented method
Ancak, arabirim bir default
yöntem bildirirse , başlatma gerçekleşir. Şu şekilde InterfaceType
verilen arayüzü düşünün
interface InterfaceType {
public static final ClassInitializer init = new ClassInitializer();
public default void method() {
System.out.println("default method");
}
}
daha sonra yukarıdaki aynı program yazdırır
static initializer
implemented method
Diğer bir deyişle, static
arayüz alanı başlatılır ( Ayrıntılı Başlatma Prosedüründe adım 9 ) ve static
başlatılmakta olan tipin başlatıcısı yürütülür. Bu, arayüzün başlatıldığı anlamına gelir.
JLS'de bunun olması gerektiğini gösteren hiçbir şey bulamadım. Beni yanlış anlamayın, uygulama sınıfının yöntem için bir uygulama sağlamaması durumunda bunun olması gerektiğini anlıyorum, ama ya sağlıyorsa? Bu durum Java Dil Spesifikasyonunda eksik mi, bir şey mi kaçırdım yoksa yanlış mı yorumluyorum?