2014-12-30 22 views
5

erklärte ich Java lerne und schreiben Sie den einfachen Code unten:eine statische Variable zuweisen, bevor

public class Test { 

    private int a = b; 
    private final static int b = 10; 

    public int getA() { 
     return a; 
    } 
} 

public class Hello { 

    public static void main(String[] args) { 
     Test test = new Test(); 
     System.out.println(test.getA()); 
    } 

} 

Das Ergebnis: 10. Gut gemacht! Es läuft erfolgreich und hat keinen Fehler.

Kann mir bitte jemand erklären, warum ich eine statische Variable zuweisen kann, bevor ich sie deklariere?

+0

mögliche Duplikate von [In welcher Reihenfolge werden Java-Klassenvariablen initialisiert?] (Http://stackoverflow.com/questions/2138801/in-what-order-are-java-class-variables-initialized) – Joe

+0

statische Mitglieder sind bereits initialisiert, sobald die Klasse geladen wurde, bevor eine Instanz davon erstellt wurde. – Braj

+0

Was meinst du mit "assign before declaring"? "int b" deklariert, "= 10" weist zu, also deklariert man vor der Zuweisung. Oder meinst du vor dem deklarieren? –

Antwort

5

Die Zuordnung

private int a = b; 

findet statt, wenn Sie eine neue Instanz von Test erstellen (kurz vor dem Konstruktor aufgerufen wird).

Die Deklaration und Initialisierung der statischen Variablen b erfolgt vor dem Erstellen der Instanz, wenn die Klasse geladen wird.

Die Reihenfolge der Anweisungen spielt keine Rolle, da statische Variablen immer zuerst initialisiert werden.

+0

"(kurz bevor der Konstruktor aufgerufen wird)" nicht ganz, Initialisierung von Feldern wird in Konstruktoren verschoben, also ist es eher "wenn Konstruktor aufgerufen wird, aber nach seinem impliziten oder expliziten' Super (Argumente) 'Aufruf". – Pshemo

+0

Können Sie ein offizielles Dokument für mich teilen? Ich mag es wirklich tief zu verstehen –

+1

@DatNguyen Das offizielle Dokument ist die JLS. Lesen Sie die Abschnitte [12.4] (http://docs.oracle.com/javase/specs/jls/se8/html/jls-12.html#jls-12.4) und [12.5] (http://docs.oracle.com) /javase/specs/jls/se8/html/jls-12.html#jls-12.5). – Eran

0

Die Reihenfolge der Deklaration von Variablen spielt in Ihrem Code keine Rolle, da in Wirklichkeit die statische Variable vor nicht statischen initialisiert wird.

0

Statische Variablen sind an eine Klasse gebunden - die natürlich immer vor Instanzen der Klasse existiert. Sie können es also frei Instanzfeldern zuweisen.

1

Javavariables sind diese Reihenfolge initialisiert:

  1. Statische Variablen des Super wenn irgendwelche
  2. statischen Variablen der aktuellen Klasse.
  3. Statische Variablen und statische Blöcke in der Reihenfolge, dass sie erklärten
  4. Instanzvariablen des Super
  5. Alle Instanzvariablen der aktuellen Klasse.
  6. Instanzvariablen und die Initialisierung Block Instanzebene, in der Reihenfolge der Deklaration

Daher "b" werden vor dem "a" initialisiert.

Hoffe, das hilft.

0

Der Code, den Sie funktioniert gut, weil private final static int b = 10; geschrieben hat, ist ein Klassenvariable (statisches Feld). Diese Art von Variablen wird zuerst initialisiert.

dann ausgeführt wird, um die Linie private int a = b; die die Instanzvariable (Feld) a initialisieren.

Kurz gesagt, ist es egal, in welcher Reihenfolge diese Variablen in Ihrem Code deklariert sind.Klassenvariablen werden immer vor Instanzvariablen deklariert.

Verwandte Themen