Ich schaue auf den Code unten und finde etwas Seltsames:
public class Sequence {
Sequence() {
System.out.print("c ");
}
{
System.out.print("y ");
}
public static void main(String[] args) {
new Sequence().go();
}
void go() {
System.out.print("g ");
}
static {
System.out.print("x ");
}
}
Ich hätte erwartet, dass dies zu einem Kompilierungsfehler führt, da das System.out
mit "y" nicht zu einer Methodendeklaration gehört, sondern nur zu a { }
. Warum ist das gültig? Ich sehe nicht, wie dieser Code aufgerufen werden würde oder sollte.
Wenn dies ausgeführt wird, wird x y c g
auch erzeugt , warum wird das static { }
vor dem Sequenzkonstruktor aufgerufen?
quelle
the code is copied into the beginning of each constructor of the class
- Das ist falsch. Angenommen, der Konstruktor beginnt mitsuper("x ");
, der Superkonstruktor wird vor allen Initialisierungsblöcken ausgeführt.Es ist keine Methode, sondern ein Initialisierungsblock .
Es wird vor dem Konstruktoraufruf ausgeführt. Während
ist ein statischer Initialisierungsblock, der ausgeführt wird, wenn die Klasse vom Klassenladeprogramm geladen wird.
Wenn Sie also Ihren Code
1 ausführen, wird die Klasse vom Klassenladeprogramm geladen, sodass der statische Initialisierungsblock ausgeführt wird.
Ausgabe: x wird gedruckt.
2. Das Objekt wird so erstellt, dass der Initialisierungsblock ausgeführt wird, und dann wird der Konstruktor
Ausgabe ausgegeben : y wird gedruckt, gefolgt von c
3. Die Hauptmethode wird aufgerufen, die wiederum die go-Methode aufruft.
Ausgabe: g wird gedruckt
Endgültige Ausgabe: xycg
Dies könnte hilfreich sein http://blog.sanaulla.info/2008/06/30/initialization-blocks-in-java/
quelle
Dies ist ein Instanzinitialisierungsblock, gefolgt von einem statischen Initialisierungsblock .
wird aufgerufen, wenn Sie eine Instanz der Klasse erstellen.
wird aufgerufen, wenn die Klasse vom Klassenladeprogramm geladen wird. Also wenn du es tust
Die Klasse wird geladen, also ausgeführt
static {}
, dann wird der Instanzinitialisierungsblock ausgeführt{}
, anschließend wird der Hauptteil des Konstruktors aufgerufen und anschließend die Methode für die neu erstellte Instanz. Ergo die Ausgabex y c g
.quelle
Ist ein statischer Block und wird beim Laden der Klasse aufgerufen
Ist ein Initialisierungsblock
Sie können mehrere Initialisierungsblöcke in einer Klasse haben. In diesem Fall werden sie in der Reihenfolge ausgeführt, in der sie in der Klasse angezeigt werden.
Beachten Sie, dass alle in der Klasse vorhandenen Initialisierungsblöcke vor dem Konstruktor ausgeführt werden.
quelle
ist ein von der Klasse gemeinsam genutzter Initialisierungsblock (wie durch angegeben
static
), der zuerst ausgeführt wird.ist ein Initialisierungsblock, der von allen Objekten (Konstruktoren) der Klasse gemeinsam genutzt wird.
ist ein bestimmter Konstruktor für die Klasse, die als dritter ausgeführt wird. Der Instanzinitialisierungsblock wird bei jeder Ausführung des Konstruktors zuerst aufgerufen. Deshalb kommt "y" kurz vor "c".
ist nur eine Instanzmethode, die Objekten zugeordnet ist, die mit dem obigen Konstruktor erstellt wurden.
quelle
Diese Arten von Blöcken werden aufgerufen
initializer block
. Es wird jedes Mal ausgeführt, wenn Sie eine Instanz von a erstellenclass
. Zur Kompilierungszeit wird dieser Code in jeden Konstruktor Ihrer Klasse verschoben.Wo wie im Fall von
static initializer
Block: -Es wird einmal ausgeführt, wenn die Klasse geladen wird. Wir verwenden im Allgemeinen den
static
Initialisierungsblock, wenn die Initialisierung einesstatic
Feldes mehrere Schritte erfordert.quelle
Es wird als Initialisierungsblock verwendet und nach jeder statischen Deklaration ausgeführt . Es kann verwendet werden, um sicherzustellen, dass niemand eine Instanz der Klasse erstellen kann (auf die gleiche Weise, wie Sie einen privaten Konstruktor verwenden würden), wie dies beim Singleton- Entwurfsmuster der Fall ist.
quelle
Static blocks
werden nur einmal ausgeführt, wenn die Klasse von der JRE geladen und initialisiert wird.Der
non-static
Block wird jedes Mal aufgerufen, wenn Sie eine neue Instanz erstellen, und er wird direkt vor dem Konstruktor aufgerufen.Da Sie hier nur eine Instanz von
Sequence
so konstruierten erstellt haben, wurde nachnon-static
Blöcken aufgerufen und dann die Methode, die eigentlich Ihr Ziel ist.quelle