Während sie durch die Java Language Specification Suche zu beantworten diese Frage , habe ich gelernt , dass
Bevor eine Klasse initialisiert wird, muss ihre direkte Oberklasse initialisiert werden, aber von der Klasse implementierte Schnittstellen werden nicht initialisiert. In ähnlicher Weise werden die Superschnittstellen einer Schnittstelle nicht initialisiert, bevor die Schnittstelle initialisiert wird.
Aus eigener Neugier habe ich es versucht und wie erwartet wurde die Schnittstelle InterfaceType
nicht initialisiert.
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();
}
Dieses Programm druckt
implemented method
Wenn die Schnittstelle jedoch eine default
Methode deklariert, erfolgt eine Initialisierung. Betrachten Sie die InterfaceType
Schnittstelle als
interface InterfaceType {
public static final ClassInitializer init = new ClassInitializer();
public default void method() {
System.out.println("default method");
}
}
dann würde das gleiche Programm oben gedruckt
static initializer
implemented method
Mit anderen Worten, das static
Feld der Schnittstelle wird initialisiert ( Schritt 9 in der detaillierten Initialisierungsprozedur ) und der static
Initialisierer des zu initialisierenden Typs wird ausgeführt. Dies bedeutet, dass die Schnittstelle initialisiert wurde.
Ich konnte im JLS nichts finden, was darauf hindeutet, dass dies geschehen sollte. Versteh mich nicht falsch, ich verstehe, dass dies passieren sollte, falls die implementierende Klasse keine Implementierung für die Methode bereitstellt, aber was ist, wenn dies der Fall ist? Fehlt diese Bedingung in der Java-Sprachspezifikation, habe ich etwas verpasst oder interpretiere ich es falsch?
interface
in Java keine konkrete Methode definiert werden sollte. Ich bin also überrascht, dass der InterfaceType
Code kompiliert wurde.
default
Methoden .