Heim  >  Artikel  >  Java  >  Java analysiert die Instanziierungsreihenfolge von Klassen aus der Perspektive einer virtuellen Maschine

Java analysiert die Instanziierungsreihenfolge von Klassen aus der Perspektive einer virtuellen Maschine

青灯夜游
青灯夜游nach vorne
2018-10-20 15:51:142109Durchsuche

In diesem Artikel erfahren Sie, wie Java die Instanziierungsreihenfolge von Klassen aus der Perspektive einer virtuellen Maschine analysiert. Es hat einen gewissen Referenzwert. Freunde in Not können sich darauf beziehen. Ich hoffe, es wird Ihnen hilfreich sein.

1. Zeigen Sie zuerst den Beispielcode (Son.java & Father.java)

public class Father {    
    public static int a=10;//父类的静态变量    static{//父类的静态代码块
        a=20;
    }
    {//父类的构造代码块
        a=30;
    }    
    public Father() {//父类的构造方法
        a=40;
    }
}
public class Son extends Father{    
    public static int s=10;//子类的静态变量    public int k=20;//子类的实例变量    static{//子类的静态代码块
        s=20;
    }
    {//子类的构造代码块
        s=30;
    }    public Son() {//子类的构造函数
        s=40;
    }
    {//子类的构造代码块
        s=50;
    }
}

2. Kompilieren Sie die son.java-Datei in eine son.class-Datei und dekompilieren Sie sie dann mit javap und Son anzeigen Die Bytecode-Anweisungen werden verwendet, um die Ladesequenz von Son zu analysieren, was leichter zu verstehen ist (javap -v -c Son > p.txt).

3. Analysieren Sie nach der Ausführung des Codes „new Son();“ die Ladereihenfolge der Klassen.

Die statische {};-Funktion ist die -Funktion.

static {};
    descriptor: ()V
    flags: ACC_STATIC
    Code:
      stack=1, locals=0, args_size=0
         0: bipush        10
         2: putstatic     #11                 // Field s:I--------------------------顺序执行静态变量的赋值
         5: bipush        20
         7: putstatic     #11                 // Field s:I--------------------------顺序执行静态代码块
        10: return
rrree

Analyse starten:

1. Führen Sie in der Initialisierungsphase zuerst die übergeordnete Klasse aus. Funktion, in der Reihenfolge Statische Variablenzuweisung und statische Codeblöcke.

2. Der Konstruktor wird im Code ausgeführt, also wird die

Fazit:

1. Statische Variablenzuweisungen werden sequentiell in der übergeordneten Klasse ausgeführt, statische Codeblöcke

2. Statische Variablenzuweisungen werden sequentiell in der Unterklasse ausgeführt, statischer Code Blöcke

3. Führen Sie nacheinander Instanzvariablenzuweisungen in der übergeordneten Klasse aus und erstellen Sie Codeblöcke.

4. Führen Sie nacheinander Instanzvariablenzuweisungen aus und erstellen Sie Codeblöcke in der Unterklasse

6. Unterklassenkonstruktor

Namenserklärung: Auszug aus „In- Depth Understanding of Java Virtual Machine: JVM Advanced Features and Best Practices“ von Herrn Zhou Zhiming

1. Ja Und es gibt nur die dritte der vier Situationen, in denen die Klasse initialisiert werden muss (führen Sie die Funktion aus): Initialisieren Sie beim Initialisieren einer Klasse zuerst die übergeordnete Klasse. Aus diesem Grund wird die Funktion der übergeordneten Klasse vor der Funktion ausgeführt.

2. Funktion: Der Compiler sammelt automatisch die Zuweisungsaktionen aller statischen Variablen in der Klasse und führt die Anweisungen im statischen Codeblock entsprechend der Reihenfolge im Quellcode zusammen.

3.-Funktion: Rufen Sie zuerst die -Funktion der übergeordneten Klasse auf, und dann sammelt der Compiler automatisch die Zuweisungsoperationen und Konstruktionscodeblöcke der Instanzvariablen in der Reihenfolge in Der Quellcode wird zusammengeführt und dann vor der Konstruktormethode eingefügt, und schließlich wird der Konstruktorcode vom Programmierer selbst geschrieben.

Der Konstruktionscodeblock wird vor der Konstruktorfunktion ausgeführt

  public packet1020.Son();
    descriptor: ()V
    flags: ACC_PUBLIC
    Code:
      stack=2, locals=1, args_size=1
         0: aload_0         
         1: invokespecial #16                 // Method packet1020/Father."<init>":()V--------------------执行父类的<init>函数(顺序不变,第一个)
         4: aload_0         
         5: bipush        20
         7: putfield      #18                 // Field k:I------------------------------------------------按顺序收集实例变量赋值
        10: bipush        30
        12: putstatic     #11                 // Field s:I------------------------------------------------按顺序收集构造代码块
        15: bipush        50
        17: putstatic     #11                 // Field s:I------------------------------------------------按顺序收集构造代码块
        20: bipush        40
        22: putstatic     #11                 // Field s:I------------------------------------------------最后执行自己的构造函数代码(顺序不变,最后一个)
        25: return

Zusammenfassung: Das Obige ist der gesamte Inhalt dieses Artikels, ich hoffe, dass er für das Lernen aller hilfreich sein wird. Weitere verwandte Tutorials finden Sie unter

Java-Video-Tutorial

, Java-Entwicklungsgrafik-Tutorial, Bootstrap-Video-Tutorial!

Das obige ist der detaillierte Inhalt vonJava analysiert die Instanziierungsreihenfolge von Klassen aus der Perspektive einer virtuellen Maschine. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:cnblogs.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen