Heim > Java > javaLernprogramm > Hauptteil

Wie ist die Initialisierungsreihenfolge von statischen Blöcken und Instanzblöcken bei der Java-Vererbung?

Patricia Arquette
Freigeben: 2024-11-27 07:00:14
Original
154 Leute haben es durchsucht

What's the Initialization Order of Static and Instance Blocks in Java Inheritance?

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");
    }
}
Nach dem Login kopieren

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
Nach dem Login kopieren

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");
    }
}
Nach dem Login kopieren

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:

  • Statische Initialisierungsblöcke aller Klassen und Schnittstellen werden unabhängig von ihrer Abhängigkeit in der Breitenreihenfolge von oben nach unten ausgeführt Beziehungen.
  • Sobald alle statischen Initialisierungsblöcke ausgeführt wurden, werden Instanzinitialisierungsblöcke und Konstruktoren aller Klassen in der Reihenfolge ausgeführt, in der die Klassen in initialisiert werden Programm.

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!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage