2013-03-15 12 views
9

Einer meiner Freunde fragte mich, was zuerst statische Variable oder statischen Block lädt.Welches wird zuerst statische Variable oder statischer Block geladen?

Meine Antwort zeigt auf statische Variable.

So gab er mir zwei Gleichungen und die zwischen ihnen
erste Gleichung

public class Some { 
    public static void main(String args[]) 
    { 
     System.out.println(Some.x); 
    } 
    static { 
     System.out.println(Some.x); 
    } 
    static int x=90; 
} 

O/P zu unterscheiden: 0 90

zweite Gleichung

public class Some { 
    public static void main(String args[]) 
    { 
     System.out.println(Some.x); 
    } 
    static int x=90; 
    static { 
     System.out.println(Some.x); 
    } 
} 

O/P: 90 90

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

+3

Statisches Zeug wird sequentiell in der Reihenfolge ausgeführt, in der es in der Klasse definiert ist. –

+0

Sind Sie sicher, dass der Byte-Code identisch ist? Ich hätte erwartet, dass die Erklärungen in einer anderen Reihenfolge erscheinen, und wie @Sudhanshu darauf hinweist, ist die Reihenfolge der Erklärungen wichtig. –

+0

@ PatriciaShanahan ya für beide die Gleichung Byte-Code ist gleich. – Hablu

Antwort

1

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

Hier erstes O/P: 0 90, wie in der System.out.println(Some.x); Anweisung des statischen Blockes nach der statischen Anweisung Variableninitialisierung ausgeführt static int x=90;

+0

Müll. Die konstante Faltung wird vom Compiler durchgeführt, nicht von der JVM. Die JVM führt statische Variableninitialisierungen und Blöcke in der Reihenfolge aus, in der sie in der Quelldatei erscheinen. Nicht zuerst Variablen und dann blockt. – EJP

+0

Edited, sorry für die Unannehmlichkeiten und danke. –

-1

statische Variablen durchgeführt werden, wenn die JVM der Klasse laden, und die Klasse wird geladen wenn entweder instanziiert oder seine statische Methode aufgerufen wird.

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

-1

I ein einfaches Beispiel für die Ablaufsteuerung von statischen und Beispiel gebe stopft:

Angenommen, Sie haben 2 clases A und B. Klasse A erstreckt sich bis zu der Klasse B und der Klasse B ein Hauptverfahren hat.Nach der erfolgreichen Erstellung sowohl Ihr Befehl cmd ist wie:

java B 

Was nun Schritt für Schritt sehen passieren wird:

wird
  1. Klassen A und B
  2. statische Elemente und Blöcke der Klasse geladen werden A wird identifiziert und wird nacheinander ausgeführt (eins nach dem anderen) (aber nur einmal zum Zeitpunkt des Ladens der Klasse)
  3. statische Mitglieder und Blöcke der Klasse B werden identifiziert und ausgeführt (eins nach dem anderen) (Aber nur einmal zur Zeit des Unterrichts loading)
  4. wird die Hauptmethode der Klasse B aufgerufen (Falls Klasse B keine Hauptmethode hat, wird die Hauptmethode von Klasse A aufgerufen)
  5. Sobald Sie ein Objekt der Klasse A: Alle erstellen Beispiel Mitglieder Initialisierung und Instanzblockausführung wird in Klasse erfolgen A
  6. der Konstruktor der Klasse A (die Sie für die Erstellung von Objekt verwendet) wird
  7. ausgeführt werden, wenn Sie ein Objekt der Klasse B zu erstellen: alle Instanz Die Initialisierung der Mitglieder und die Ausführung des Instanzblocks erfolgen in Klasse A.
  8. der Konstruktor der Klasse A (Standard-Konstruktor oder einem anderen, wenn Sie es aus B Konstruktor genannt) wird

  9. dann alle Instanz Mitglieder Initialisierung und Instanzblockausführung in Klasse B ausgeführt werden

    getan werden
  10. und danach der Konstruktor der Klasse B (die man für die Erstellung Objekt verwendet) wird

Hinweis ausgeführt werden: statische Elemente und Blöcke Ausführungs wird beim ersten Laden der Klasse nur einmal ausgeführt, 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 richtig bin.

+0

"Klasse A erstreckt sich bis zur Klasse B" ist bestenfalls zweideutig oder schlimmstenfalls bedeutungslos. Wenn du meinst, dass A den größten Teil deiner Antwort ausdehnt, ist es falsch. – EJP

+0

Konnte dich nicht verstehen, bitte erkläre deinen Standpunkt. –

+0

Ich glaube nicht, dass ich es kann. Es scheint mir schon vollkommen klar zu sein. Sie müssen die Aussage, die ich zitiert habe, klarstellen. – EJP

Verwandte Themen