Meine Frage bezieht sich auf eine bestimmte Verwendung des statischen Schlüsselworts. Es ist möglich, ein static
Schlüsselwort zu verwenden, um einen Codeblock innerhalb einer Klasse abzudecken, die keiner Funktion angehört. Zum Beispiel wird folgender Code kompiliert:
public class Test {
private static final int a;
static {
a = 5;
doSomething(a);
}
private static int doSomething(int x) {
return (x+5);
}
}
Wenn Sie das static
Schlüsselwort entfernen, wird es beschwert, weil die Variable a
ist final
. Es ist jedoch möglich, sowohl Schlüsselwörter als auch Schlüsselwörter zu entfernen final
und static
kompilieren zu lassen.
Es ist in vielerlei Hinsicht verwirrend für mich. Wie soll ich einen Codeabschnitt haben, der zu keiner Methode gehört? Wie ist es möglich, es aufzurufen? Was ist im Allgemeinen der Zweck dieser Verwendung? Oder besser, wo finde ich Dokumentation dazu?
quelle
public static void staticMethod(){}
, wenn Sie ausführenTestStatic.class.getMethod("staticMethod");
. Der statische Initialisierer wird nicht aufgerufen. Weitere Informationen hier docs.oracle.com/javase/specs/jvms/se10/html/…Uff! Was ist ein statischer Initialisierer?
Der statische Initialisierer ist ein
static {}
Codeblock innerhalb der Java-Klasse und wird nur einmal ausgeführt, bevor der Konstruktor oder die Hauptmethode aufgerufen wird.OK! Erzähl mir mehr...
static { ... }
in jeder Java-Klasse. und von der virtuellen Maschine ausgeführt, wenn die Klasse aufgerufen wird.return
werden keine Anweisungen unterstützt.this
odersuper
werden unterstützt.Hmm wo kann ich es verwenden?
Kann überall verwendet werden, wo du dich gut fühlst :) so einfach. Aber ich sehe, dass es die meiste Zeit verwendet wird, wenn Datenbankverbindungen, API-Init, Protokollierung usw. ausgeführt werden.
Bellen Sie nicht nur! wo ist beispiel
Ausgabe???
Hoffe das hilft!
quelle
afterPropertiesSet()
von verwendet werdenInitializingBean
?Der
static
Block ist ein "statischer Initialisierer".Es wird automatisch aufgerufen, wenn die Klasse geladen wird, und es gibt keine andere Möglichkeit, sie aufzurufen (nicht einmal über Reflection).
Ich persönlich habe es nur beim Schreiben von JNI-Code verwendet:
quelle
Method
Instanz dargestellt, sondern nur von der virtuellen Java-Maschine.Dies ist direkt von http://www.programcreek.com/2011/10/java-class-instance-initializers/
1. Ausführungsreihenfolge
Schauen Sie sich die folgende Klasse an. Wissen Sie, welche zuerst ausgeführt wird?
Ausgabe:
2. Wie funktioniert der Java-Instanzinitialisierer?
Der obige Instanzinitialisierer enthält eine println-Anweisung. Um zu verstehen, wie es funktioniert, können wir es als variable Zuweisungsanweisung behandeln, z
b = 0
. Dies kann das Verständnis offensichtlicher machen.Anstatt
int b = 0
, du könntest schreibenDaher sind Instanzinitialisierer und Instanzvariableninitialisierer ziemlich gleich.
3. Wann sind Instanzinitialisierer nützlich?
Die Verwendung von Instanzinitialisierern ist selten, kann jedoch eine nützliche Alternative zu Instanzvariableninitialisierern sein, wenn:
Natürlich könnte ein solcher Code in Konstruktoren geschrieben werden. Wenn eine Klasse jedoch mehrere Konstruktoren hätte, müssten Sie den Code in jedem Konstruktor wiederholen.
Mit einem Instanzinitialisierer können Sie den Code nur einmal schreiben. Er wird ausgeführt, unabhängig davon, mit welchem Konstruktor das Objekt erstellt wird. (Ich denke, dies ist nur ein Konzept und es wird nicht oft verwendet.)
Ein weiterer Fall, in dem Initialisierer nützlich sind, sind anonyme innere Klassen, die überhaupt keine Konstruktoren deklarieren können. (Ist dies ein guter Ort, um eine Protokollierungsfunktion zu platzieren?)
Danke an Derhein.
Beachten Sie auch, dass anonyme Klassen, die Schnittstellen [1] implementieren, keine Konstruktoren haben. Daher werden Instanzinitialisierer benötigt, um alle Arten von Ausdrücken zur Konstruktionszeit auszuführen.
quelle
"final" garantiert, dass eine Variable vor dem Ende des Objektinitialisierungscodes initialisiert werden muss. Ebenso garantiert "static final", dass eine Variable bis zum Ende des Klasseninitialisierungscodes initialisiert wird. Wenn Sie das "Statische" aus Ihrem Initialisierungscode weglassen, wird es in einen Objektinitialisierungscode umgewandelt. Somit erfüllt Ihre Variable ihre Garantien nicht mehr.
quelle
Sie werden keinen Code in einen statischen Block schreiben, der irgendwo in Ihrem Programm aufgerufen werden muss. Wenn der Zweck des Codes aufgerufen werden soll, müssen Sie ihn in eine Methode einfügen.
Sie können statische Initialisierungsblöcke schreiben, um statische Variablen beim Laden der Klasse zu initialisieren. Dieser Code kann jedoch komplexer sein.
Ein statischer Initialisierungsblock sieht aus wie eine Methode ohne Namen, ohne Argumente und ohne Rückgabetyp. Da Sie es nie nennen, braucht es keinen Namen. Es wird nur aufgerufen, wenn die virtuelle Maschine die Klasse lädt.
quelle
Wenn ein Entwickler einen Initialisiererblock verwendet, kopiert der Java-Compiler den Initialisierer in jeden Konstruktor der aktuellen Klasse.
Beispiel:
den folgenden Code:
ist äquivalent zu:
Ich hoffe, mein Beispiel wird von Entwicklern verstanden.
quelle
Der statische Codeblock kann zum Instanziieren oder Initialisieren von Klassenvariablen verwendet werden (im Gegensatz zu Objektvariablen). Das Deklarieren von "a" static bedeutet also, dass nur eines von allen Testobjekten gemeinsam genutzt wird, und der statische Codeblock initialisiert "a" nur einmal, wenn die Testklasse zum ersten Mal geladen wird, unabhängig davon, wie viele Testobjekte erstellt werden.
quelle