Initialisierungssequenz von statischen und Instanzblöcken in Java
Wenn Sie mit mehreren Klassen in Java arbeiten, verstehen Sie die Ausführungsreihenfolge für statische und Instanzblöcke Initialisierungsblöcke werden von entscheidender Bedeutung. Obwohl bekannt ist, dass diese Blöcke innerhalb einer Klasse in der Reihenfolge ihres Auftretens ausgeführt werden, besteht weiterhin Unsicherheit hinsichtlich ihres Verhaltens zwischen den Klassen.
Um dieses Verhalten zu demonstrieren, betrachten Sie den folgenden Code:
package pkg; public class LoadTest { public static void main(String[] args) { System.out.println("START"); new Child(); System.out.println("END"); } } class Parent extends Grandparent { // Instance init block { System.out.println("instance - parent"); } // Constructor public Parent() { System.out.println("constructor - parent"); } // Static init block static { System.out.println("static - parent"); } } class Grandparent { // Static init block static { System.out.println("static - grandparent"); } // Instance init block { System.out.println("instance - grandparent"); } // Constructor public Grandparent() { System.out.println("constructor - grandparent"); } } class Child extends Parent { // Constructor public Child() { System.out.println("constructor - child"); } // Static init block static { System.out.println("static - child"); } // Instance init block { System.out.println("instance - child"); } }
Erwartungsgemäß stimmt die Ausgabe dieses Codes mit der Annahme überein, dass statische Blöcke vor Instanzblöcken ausgeführt werden:
START static - grandparent static - parent static - child instance - grandparent constructor - grandparent instance - parent constructor - parent instance - child constructor - child END
Diese Beobachtung allein klärt jedoch nicht die Initialisierungsreihenfolge zwischen Eltern- und Kinderkurse. Um diesen Aspekt weiter zu untersuchen, sollten Sie erwägen, dem Code die folgende nicht verwendete Klasse hinzuzufügen:
class IAmAClassThatIsNeverUsed { // Constructor public IAmAClassThatIsNeverUsed() { System.out.println("constructor - IAACTINU"); } // Instance init block { System.out.println("instance - IAACTINU"); } // Static init block static { System.out.println("static - IAACTINU"); } }
Bemerkenswerterweise erzeugt der geänderte Code immer noch die gleiche Ausgabe wie der ursprüngliche Code. Dies bedeutet, dass die statischen Initialisierungsblöcke und die Instanzinitialisierungsblöcke in der folgenden Reihenfolge ausgeführt werden:
Dieses Verhalten steht im Einklang mit der Java Language Specification (JLS), die detaillierte Erläuterungen in den Abschnitten 12.4 und 12.5 enthält.
Das obige ist der detaillierte Inhalt vonWie ist die Initialisierungsreihenfolge von statischen Blöcken und Instanzblöcken bei der Java-Vererbung?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!