Ich habe zwei Klassen Eltern und Kind
public class Parent {
public Parent() {
System.out.println("Parent Constructor");
}
static {
System.out.println("Parent static block");
}
{
System.out.println("Parent initialisation block");
}
}
public class Child extends Parent {
{
System.out.println("Child initialisation block");
}
static {
System.out.println("Child static block");
}
public Child() {
System.out.println("Child Constructor");
}
public static void main(String[] args) {
new Child();
}
}
Die Ausgabe des obigen Codes wird sein
Parent static block
Child static block
Parent initialization block
Parent Constructor
Child initialization block
Child Constructor
Warum führt Java den Code in dieser Reihenfolge aus? Welche Regeln bestimmen die Ausführungsreihenfolge?
Es gibt mehrere Spielregeln
super();
implizit auf, bevor er seinen eigenen Konstruktor ausführt. Der Initialisierungsblock tritt bereits vor dem Aufruf des Konstruktors in Kraft. Deshalb wird er zuerst aufgerufen. Nun ist Ihr Elternteil erstellt und das Programm kann weiterhin eine Kindklasse erstellen, die denselben Prozess durchläuft. Erklärungen:
- Der statische Block des übergeordneten Elements wird zuerst ausgeführt, da er zuerst geladen ist und statische Blöcke beim Laden der Klasse aufgerufen werden.
Ich lerne visuell, also hier eine visuelle Darstellung der Reihenfolge, als SSCCE :
public class Example {
static {
step(1);
}
public static int step_1 = step(2);
public int step_6 = step(6);
public Example() {
step(8);
}
{
step(7);
}
// Just for demonstration purposes:
public static int step(int step) {
System.out.println("Step " + step);
return step;
}
}
public class ExampleSubclass extends Example {
{
step(9);
}
public static int step_3 = step(3);
public int step_10 = step(10);
static {
step(4);
}
public ExampleSubclass() {
step(11);
}
public static void main(String[] args) {
step(5);
new ExampleSubclass();
step(12);
}
}
Dies druckt:
Step 1
Step 2
Step 3
Step 4
Step 5
Step 6
Step 7
Step 8
Step 9
Step 10
Step 11
Step 12
Beachten Sie, dass die Reihenfolge der static
-Teile von Bedeutung ist. Schauen Sie sich den Unterschied zwischen der Reihenfolge der Example
-Sachen von static
und ExampleSubclass
an.
Beachten Sie auch, dass der Instanzinitialisierungsblock unabhängig vom Auftrag immer vor dem Konstruktor ausgeführt wird. Die Reihenfolge ist jedoch zwischen einem Initialisierungsblock und einem Feldinitialisierer wichtig.
Führen Sie nur die erste Kindklasse aus (kommentieren Sie die extend-Klausel), um den einfachen Ablauf zu sehen.
sekunde - gehe zu Statischer Block vs. Initialisierungsblock in Java? & las die akzeptierte Antwort dort.
Bearbeiten:
Statischer Block in Java wird vor der Hauptmethode ausgeführt. Wenn wir einen statischen Block in der Java-Klasse deklarieren, wird er beim Laden der Klasse ausgeführt. Dies wird mit den statischen Variablen initialisiert. Es wird hauptsächlich in JDBC verwendet. Statischer Block in Java wird jedes Mal ausgeführt, wenn eine Klasse geladen wird. Dies wird auch als statischer Initialisierungsblock bezeichnet. Der statische Block in Java wird initialisiert, wenn die Klasse in den Speicher geladen wird. Dies bedeutet, wenn die JVM den Bytecode liest. Initialisierung kann alles sein; Es kann sich um eine variable Initialisierung oder um etwas anderes handeln, das von allen Objekten dieser Klasse gemeinsam genutzt werden sollte. Statischer Block ist ein normaler Codeblock, der in geschweifte Klammern {} eingeschlossen ist und dem ein statisches Schlüsselwort vorangestellt ist.
also zuerst ein statischer Block ausgeführt.
Instanzinitialisierungsblöcke: Wird jedes Mal ausgeführt, wenn die Instanz der Klasse erstellt wird.
so nächster Initialisierungsblock wird ausgeführt, wenn eine Instanz der Klasse erstellt wird.
dann wird Constructor ausgeführt
(In Ihrem Code werden zuerst die übergeordneten statischen Blöcke und dann die untergeordneten statischen Blöcke ausgeführt.)
In Ihrem Code, wenn Sie ein untergeordnetes Objekt erstellen:
Folgendes habe ich gefunden, als ich mich auf eine Zertifizierung vorbereitete.
Während wir eine Klasse ausführen, erfolgt die erste Initialisierung der statischen Blöcke/statischen Variablen. Wenn mehrere statische Blöcke vorhanden sind, wird es in der Reihenfolge ausgeführt, in der es erscheint.
Dann wird es Initialisierungsblöcke/Instanzvariableninitialisierung ausführen. Wenn mehrere Initialisierungsblöcke/Variableninitialisierung vorhanden sind, wird sie in der Reihenfolge ausgeführt, in der sie auftritt
Danach schaut es in den Konstruktor.
Es wäre sehr hilfreich, den Objektkonstruktionsprozess mit einem schrittweisen Debugger zu überprüfen, der eine Ansicht enthält, in der Sie sehen können, wie Ihr Objekt durch die Phasen geht. Ich fand das sehr nützlich, um die Perspektive von einem höheren Standpunkt aus zu klären. Eclipse kann Ihnen dabei helfen, indem Sie den Debugger in die Funktion einsteigen.
Ich wollte nur meine Ergebnisse teilen ... Ich habe in einer Antwort in einem anderen Thread gelesen, dass statische Blöcke zuerst vor statischen Feldern ausgeführt werden, was nicht korrekt ist. Es hängt davon ab, was zuerst kommt: statisches Feld oder statischer Block. Schauen Sie sich den Code unten an. Es wird versucht, die Dinge in die richtige Perspektive zu bringen.
Es kommt zurück zur Hauptmethode.
class TestLab {
static int method(String a) {
System.out.println("in static method of TestLab" + " Coming from " + a);
System.out.println("b is " + b);
return 6;
}
static int a = method("Line 11");
static int b = 7;
TestLab() {
System.out.println("Inside test lab constructor");
}
static {
System.out.println("In static block of TestLab");
}
}
public class Test1 {
public static void main(String[] args) {
System.out.println("inside main method of Test 1");
int a = TestLab.method("Line 26");
}
// static Test ref=new Test();
Test1() {
System.out.println("Default Constructor of Test1");
}
{
System.out.println("In instance block of Test1");
}
static int d = TestLab.method("Line 37");
static int e = methodOfTest1();
static {
System.out.println("In Static Block of Test1");
}
static int methodOfTest1() {
System.out.println("inside static method:mehtodOfTest1()");
return 3;
}
}
Hier ist die Ausgabe:
in static method of TestLab Coming from Line 11
b is 0
In static block of TestLab
in static method of TestLab Coming from Line 37
b is 7
inside static method:mehtodOfTest1()
In Static Block of Test1
inside main method of Test 1
in static method of TestLab Coming from Line 26
b is 7
steuerfluss ist-
statischer Block -> Initialisierungsblock -> und abschließend Konstruktor.
statischer Block -> Dieser statische Block wird ausgeführt nur einmal, wenn das Steuerelement an die Klasse kommt (JVM Diese Klasse laden).
Initialisierungsblock -> Dieser Initialisierungsblock wird immer dann ausgeführt, wenn ein neues Objekt für die Klasse erstellt wird (er wird von der zweiten Anweisung des Konstruktors aus ausgeführt, dann die folgenden Konstruktoranweisungen - remember.) Erste Anweisung des Konstruktors ist Super (). /diese())
Konstruktor -> Wird abgerufen, wenn ein neues Objekt erstellt wird.
1.Statischer Init-Block wird ausgeführt, wenn nur die Klasse geladen wird . Der 2.Init-Block wird jedes Mal ausgeführt, bevor ein Objekt der Klasse erstellt wird.
Der statische Block wird ausgeführt, wenn eine Klasse in die JVM geladen wird. Während der Init-Block in den Konstruktor kopiert wird, wird dessen Objekt erstellt und vor der Objekterstellung ausgeführt.