Welches wird zuerst statische Variable oder statischer Block geladen? [Duplikat]

9

Einer meiner Freunde fragte mich, was die erste statische Variable oder statischen Block laden würde.

Meine Antwort zeigt auf eine statische Variable.

Also hat er mir zwei Gleichungen gegeben und gesagt, zwischen ihnen zu unterscheiden. Erste Gleichung

%Vor%

O / P: 0 90

Zweite Gleichung

%Vor%

O / P: 90 90

Ich habe versucht, den Bytecode zu dekompilieren und fand heraus, dass es für die obige Gleichung gleich ist. Bitte hilf mir, zwischen ihnen zu unterscheiden. Ich bin verwirrt, wenn die statische Variable initialisiert wird.

    
Hablu 15.03.2013, 08:28
quelle

4 Antworten

5

Statische Blöcke werden in der Reihenfolge initialisiert, in der sie in der Quelldatei erscheinen. Zu diesem Thema gibt es bereits einige Fragen zu Stack Overflow ... Dieser hat eine gute Antwort für Sie: Java: in welcher Reihenfolge Sind statische Endfelder initialisiert?

    
James 15.03.2013 08:33
quelle
1

statische Variablen und statische Blöcke werden in einer Reihenfolge ausgeführt, in der sie erscheinen.

Hier zuerst O / P: 0 90 wie in der Anweisung System.out.println(Some.x); des statischen Blocks, der nach der Initialisierungsanweisung der statischen Variablen static int x=90;

ausgeführt wird     
Shreyos Adikari 15.03.2013 08:37
quelle
-1

static Variablen werden ausgeführt, wenn die JVM die Klasse lädt, und die Klasse wird geladen, wenn sie entweder instanziiert oder ihre statische Methode aufgerufen wird.

Der statische Initialisiererblock wird initialisiert, bevor die Klasse instanziiert wird oder bevor ihre statische Methode aufgerufen wird, und sogar bevor ihre statische Variable verwendet wird.

    
Bhavesh Shah 15.03.2013 08:40
quelle
-1

Ich gebe ein einfaches Beispiel für den Kontrollfluss von statischen und instance-stuffs:

Angenommen, Sie haben 2 Klassen A und B. Klasse A erstreckt sich auf Klasse B. und Klasse B hat eine Hauptmethode. Nach der erfolgreichen Kompilierung von beiden ist Ihr Befehl auf cmd wie folgt:

%Vor%

Was nun geschehen wird, sehen Sie Schritt für Schritt:

  1. Klassen A und B werden geladen
  2. statische Mitglieder und Blöcke der Klasse A werden identifiziert und werden es sein nacheinander ausgeführt (eins nach dem anderen) (aber nur einmal zum Zeitpunkt des Ladens der Klasse)
  3. statische Member und Blöcke der Klasse B werden identifiziert und nacheinander ausgeführt (aber nur einmal zum Zeitpunkt des Ladens der Klasse)
  4. Hauptmethode der Klasse B wird aufgerufen (Falls Klasse B keine Hauptmethode hat, wird die Hauptmethode der Klasse A aufgerufen)
  5. Sobald Sie ein Objekt der Klasse A erstellen werden: alle Instanzen Die Initialisierung der Mitglieder und die Ausführung des Instanzblocks erfolgen in Klasse A
  6. der Konstruktor der Klasse A (den Sie zum Erstellen des Objekts verwendet haben) ausgeführt werden
  7. Wenn Sie ein Objekt der Klasse B erstellen: alle Instanzen     Die Initialisierung der Mitglieder und die Ausführung des Instanzblocks erfolgen in     Klasse A.
  8. der Konstruktor der Klasse A (Standardkonstruktor oder jeder andere, wenn Sie ihn aus dem Konstruktor von B aufgerufen haben)         ausgeführt werden

  9. dann alle Instanzen         Die Initialisierung der Mitglieder und die Ausführung des Instanzblocks erfolgen in         Klasse B

  10. und danach der Konstruktor der Klasse B (für den du benutzt hast) Objekt erstellen) wird ausgeführt

Hinweis: Die Ausführung statischer Member und Blöcke wird nur ein einziges Mal ausgeführt, während die Klasse zum ersten Mal geladen wird, während Instanzelemente und Instanzblöcke jedes Mal ausgeführt werden, wenn wir ein Objekt der Klasse erstellen. Bitte lassen Sie mich wissen, wenn ich nicht korrekt bin.

    
Shailesh Saxena 15.03.2013 08:51
quelle

Tags und Links