Auf statischen und nicht statischen Initialisierungsblöcken in Java

8

Ich dachte ursprünglich, dass statische Blöcke für statische Variablen sind, aber der Compiler erlaubt sowohl A als auch B zu kompilieren und auszuführen, was gibt?
A

%Vor%

B

%Vor%

Ausführen von System.out.println(Main.m.toString()); für A druckt

  

{}

aber das gleiche für B läuft in Yoda-speak

aus
  

{dies = Arbeit, warum = tut}

    
non sequitor 15.10.2009, 20:41
quelle

2 Antworten

13

Der nicht statische Block wird ausgeführt, wenn eine "Instanz" der Klasse erstellt wird.

Also

%Vor%

druckt nichts, weil Sie keine Instanz erstellt haben.

Versuchen Sie zuerst, eine Instanz zu erstellen.

%Vor%

und Sie sehen dieselbe Nachricht wie B

Wie Sie wissen, sind Klassenvariablen (die mit static deklariert wurden) beim Verwenden von Instanzblöcken im Bereich.

Siehe auch:

Anonyme Code-Blöcke in Java

    
OscarRyz 15.10.2009, 20:45
quelle
6

In A haben Sie einen Instanzinitialisierer. Es wird jedes Mal ausgeführt, wenn Sie eine neue Instanz von A erstellen.

Wenn mehrere Threads A Instanzen erstellen, würde dieser Code brechen. Und selbst in einem einzelnen Thread möchten Sie normalerweise nicht, dass eine einzelne Instanz den Zustand ändert, der von jeder Instanz gemeinsam genutzt wird. Aber wenn Sie es getan haben, ist dies ein Weg, um es zu erreichen.

    
erickson 15.10.2009 20:43
quelle

Tags und Links