Verhalten der Initialisierungsblöcke

8

Ich habe Code, den ich nicht verstehen kann, wie er diese Ausgabe erzeugt. Hier ist der Code unten -

Code:

%Vor%

Ausgabe:

r1 r4 pre b1 b2 r3 r2 hawk

Fragen:

Meine spezifischen Fragen zu diesem Code sind -

  1. Wenn Hawk class instationiert ist, bewirkt dies, dass Raptor class instationiert wird und daher der statische Codeblock zuerst ausgeführt wird. Auf statischen Code sollten dann vor dem Drucken von pre nicht statische Werte folgen. Ist es nicht?
  2. Diese nicht statischen Initialisierungsblöcke scheinen sich tatsächlich wie Konstruktoren zu verhalten. Können diese also als Konstruktoren in der regulären Programmierung verwendet werden?
Prateek Singla 07.06.2013, 12:59
quelle

4 Antworten

7
  Auf den statischen Code sollten vor dem Drucken vor dem statischen Code nicht statische folgen. Ist es nicht?

  1. Das Ausführen von Hawk.main löst die Initialisierung aller drei Klassen aus. Dies ist, wenn die statischen Initialisierer laufen;
  2. pre wird gedruckt;
  3. new Hawk() löst die Ausführung von Instanzinitialisierungen für alle drei Klassen aus.
  

können diese als Konstruktoren in der regulären Programmierung verwendet werden?

Sie werden zusammen mit Code aus Konstruktoren in <init> Methoden kompiliert. Also, sie sind ähnlich dem Konstruktorcode. Der Hauptunterschied besteht darin, dass sie unabhängig davon ausgeführt werden, welcher Konstruktor ausgeführt wird, und vor dem Konstruktorhauptteil ausgeführt werden.

    
Marko Topolnik 07.06.2013, 13:04
quelle
3

Die Blöcke static werden ausgeführt, wenn die Klasse geladen wird. Daher werden sie ausgeführt, bevor Ihre Methode main() ausgeführt wird.

Die Initialisierungsblöcke werden vor den Konstruktoren ausgeführt. Der Unterschied zwischen einem Konstruktor und einem Initialisierungsblock besteht darin, dass ein Konstruktor Parameter haben kann.

Beachten Sie auch, dass die Initialisierungsblöcke und Konstruktoren zuerst in der Basisklasse und danach in der Unterklasse ausgeführt werden.

    
Uwe Plonus 07.06.2013 13:04
quelle
0

1 - Der Pre wird zuerst gedruckt, weil Sie Hawk nur dann erstellen, wenn Sie den neuen Hawk () ausführen, bis zu diesem Moment werden nur statische Initialisierer ausgeführt.

2 - Nicht-statische Initialisierung wird normalerweise angewendet, um Werte von Variablen zu initialisieren, aber da Sie keine Parameter an sie übergeben können, werden Sie wahrscheinlich im Vergleich zu Konstruktoren dasselbe erreichen. In diesen Blöcken können Sie Ihre Attribute auf konstante Werte oder leere Werte initialisieren.

    
mrcaramori 07.06.2013 13:05
quelle
0
  1. Die statischen Initialisierer werden zuerst ausgeführt (eigentlich in der Reihenfolge der Definition)
  2. Sie können Initialisierungsblöcke verwenden, aber es ist ein gängiges Idiom, Felder an der Deklaration oder im Konstruktor zu initialisieren.

Das Java-Tutorials-Dokument finden Sie im Detail.

    
Jens Birger Hahn 07.06.2013 13:08
quelle