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
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
Analyse starten:
1. Führen Sie in der Initialisierungsphase zuerst die übergeordnete Klasse
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
2.
3.
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!