Wenn nicht statische Klasse-Initialisierung passieren?
Wann sind die statischen Felder initialisiert? Wenn ich nie instanziieren einer Klasse, aber ich habe Zugriff auf ein statisches Feld, das sind ALLES statische Blöcke und private statische Methoden zu instanzieren private statische Felder genannt (in der Reihenfolge) in diesem Augenblick?
Was ist, wenn ich das aufrufen einer statischen Methode? Tut es auch laufen alle statischen Blöcke? Bevor die Methode?
Ähnlich wie für statische Initialisierer blocks: stackoverflow.com/questions/2007666/...
InformationsquelleAutor Tony R | 2010-08-17
Du musst angemeldet sein, um einen Kommentar abzugeben.
Einer Klasse statische Initialisierung geschieht in der Regel unmittelbar vor der ersten mal, wenn eines der folgenden Ereignisse auftreten:
für eine top-level-Klasse, eine assert-Anweisung lexikalisch geschachtelt innerhalb der Klasse ausgeführt1.Sehen JLS 12.4.1.
Ist es auch möglich, zu zwingen, eine Klasse zu initialisieren (wenn es nicht bereits initialisiert ist) mit
- Klasse.forName(fqn, true, classLoader)
oder die kurze form- Klasse.forName(fqn)
1 - Der Letzte Punkt war in der JLS für Java 6 durch Java 8, aber es war anscheinend ein Fehler in der Spezifikation. Es wurde schließlich behoben, in der Java-9 JLS: siehe Quelle.
String
s ersetzt sind, und nicht auf die verwiesen wird. Hinweis wenn Sie eineclass Other { public static final int VAL = 10; }
von einigen KlasseMyClass { private int = Other.VAL; }
die KlasseOther
wird nicht geladen. Anstelle, der compiler ersetzen Sie einfach das Letzte Feld zur compile-Zeit.ja ... das ist die Konstante statische Feld-Fall.
dies ist nicht der Fall für alle 'static final' primitive oder
String
Variablen, die nur Einsen initialisiert, indem ein konstanter Ausdruck.Ja, und das Feld nicht sogar brauchen, um
static
dies ist zwar häufiger der Fall.InformationsquelleAutor Stephen C
Statischen Felder initialisiert werden, während die Initialisierung "phase" des class loading (laden, linken und Initialisierung) , enthält statische Initialisierungen und Initialisierungen von seiner statischen Felder. Die statischen Initialisierungen ausgeführt werden in einer textuellen Reihenfolge wie in der Klasse definiert.
Betrachten Sie das Beispiel:
Den Test.b druckt
null
denn wenn diesayHello
genannt wurde, im statischen Bereich, die statische variablea
wurde nicht initialisiert.C Sie haben Recht, ich habe es für einen Mangel an einem besseren Begriff, vielleicht werde ich zitieren.
bedeutet das, dass die Klasse be findet, weist es den Speicher für die statischen Variablen (& Methoden), aber diese statischen Variablen werden nicht initialisiert mit Werten in code? denn hier ist es seemd, wenn b->sayHello()->a, a ' ist im Speicher, aber es ist noch nicht zugewiesen.
Im Grunde, ja.
InformationsquelleAutor naikus
Ja, alle statischen Initialisierungen ausgeführt werden, bevor Sie access Klasse zum ersten mal. Wenn es keine andere Möglichkeit, ich nenne es einen bug.
InformationsquelleAutor Nikita Rybak