Wie pro JLS:Erstellen ein Objekt einer Klasse in einem eigenen statischen Initialisierer
A-Klasse oder Schnittstelle Typ T wird unmittelbar vor dem ersten Auftreten von einem der folgenden Schritten initialisiert wird:
T ist eine Klasse und eine Instanz von T wird erstellt.
Auch sagt er,
Initialisierung einer Klasse besteht seine statische initializers der Ausführung und die Initialisierungen für statische Felder (Klassenvariablen) in der Klasse deklariert
Daraus schließe ich zwei Punkte
- Klasseninitialisierung besteht
- Klasseninitialisierung geschieht seine statischen Initialisierungen auszuführen, wenn eine Klasse instanziiert wird.
Jetzt
Ich gehe davon aus, wenn ich ein Objekt einer Klasse-Test in seiner eigenen (Test eigenen) statische Initialisierer schaffen sollte es mir einen Stapelüberlauf werfen, da es sich immer wieder, weil gemäß der oben nennen sollte zwei Punkte, Instanziierung der Klasse sollte die Klasse initialisieren und Initialisierungsblock hat die Instanziierung der Klasse. Ein Stapelüberlauf tritt auf, wenn ich die Klasse in einem eigenen Konstruktor oder in einem eigenen Instanzinitialisierer instanziiere.
Zum Beispiel
public class Test {
static{
System.out.println("static test");
new Test();
}
{
//new Test(); // This will give a stack overflow
System.out.println("intializer");
}
public Test(){
//new Test(); // This will give a stack overflow
System.out.println("constructor");
}
public static void main(String[] args) {
}
}
jedoch das Ergebnis etwas anders ist.
Ergebnis:
statischer Test intializer Konstruktor
Entweder ich bin zu verwirrt, um die Initialisierung der Klasse zu verstehen, oder ich entschuldige mich, wenn ich etwas sehr offensichtlich bin hier fehlt und schätze deine Hilfe.
statische Block wird nur einmal aufgerufen .. Warum denkst du, es wird oft aufgerufen werden? – Constantin
@Constantin Weil die JLS so sagt. (Oder genauer, es bedeutet, dass in diesem Fall der statische Initialisierer laufen muss, bevor der statische Initialisierer läuft) – immibis
Constantin, danke für die Antwort, ich dachte, dass der statische Block wiederum das Objekt der Klasse selbst erzeugt, das die Klasse initialisieren würde wieder (duh auf mich, wenn das blooper ist, aber ich bin hier verwirrt), trotzdem glaube ich, statische Block wird nur einmal aufgerufen und dieser Block ist Instanziierung der Klasse selbst, die nichts anderes als ein Singleton-Objekt ist? – chebus