Streng genommen Java hat keine statischen Konstruktoren , weil ein Konstruktor per definitionem nicht sein statisch. Was Sie meinen, wird als "statischer Initialisierungsblock" bezeichnet. Ein Konstruktor impliziert, dass Sie ein Objekt konstruieren. Sie können keinen Konstruktor für eine Klasse haben, da eine Klasse keine Instanz von sich selbst ist. Es ist einfach eine Klasse. Das, was die Klasse "konstruiert", heißt Compiler (oder virtuelle Maschine, je nachdem, was unter "Konstrukten" zu verstehen ist). Wenn Sie Code innerhalb eines anderen Codes erstellen, beginnen Sie mit der Codegenerierung ein ganz anderes Tier.
Abgesehen von der Nichtauswahl wird ein statischer Initialisierungsblock verwendet, um komplexe statische Felder (oder Felder auf Klassenebene) für eine Klasse zu initialisieren. Normalerweise werden diese verwendet, um Dinge zu initialisieren, die entweder nicht in einer Zeile initialisiert werden können oder die erfordern, dass zuerst ein anderes Objekt (das möglicherweise in der Klasse ist, in der der statische Block implementiert ist oder nicht) initialisiert wird.
Grundsätzlich könnte man sie verwenden, um der Klasse zu sagen: "Hey, setze die Variable A ZUERST auf diesen Wert und verwende dann, sobald dies erledigt ist, den Wert von A, um B zu initialisieren." Da Java erfordert, dass die Standardfeldinitialisierung entweder innerhalb eines Konstruktors oder einer Methode oder über den Aufruf eines Konstruktors oder einer Methode (sofern es sich nicht um ein Literal handelt) erfolgt, können diese eine bequeme Methode zum Initialisieren komplexer statischer Objekte sein.
Statische Initialisierungsblöcke werden nicht allzu oft benötigt und sollten im Allgemeinen vermieden werden, es sei denn, sie haben eine echte Verwendung. Versteh mich nicht falsch, sie haben ihren Platz in Java, aber wie viele andere Dinge (wie break-, return-, switch- und goto-Anweisungen) können sie leicht überbeansprucht werden, was ihre Lesbarkeit und Wartbarkeit des Codes verringert -Basis, in der sie verwendet werden.
Ein kurzes Beispiel für die Verwendung eines statischen Initialisierungsblocks wäre das Folgende (gemäß der hervorragenden Erklärung der hier gefundenen statischen Initialisierungsblöcke ):
Code:
public class StaticExample{
static {
System.out.println("This is first static block");
}
public StaticExample(){
System.out.println("This is constructor");
}
public static String staticString = "Static Variable";
static {
System.out.println("This is second static block and "
+ staticString);
}
public static void main(String[] args){
StaticExample statEx = new StaticExample();
StaticExample.staticMethod2();
}
static {
staticMethod();
System.out.println("This is third static block");
}
public static void staticMethod() {
System.out.println("This is static method");
}
public static void staticMethod2() {
System.out.println("This is static method2");
}
}
Ausgabe:
This is first static block
This is second static block and Static Variable
This is static method
This is third static block
This is constructor
This is static method2
Einige Fälle, in denen statische Blöcke nützlich sein können:
- Wenn Sie Treiber und andere Elemente in den Namespace laden. Zum Beispiel hat die Klassenklasse einen statischen Block, in dem sie die Eingeborenen registriert.
- Wenn Sie eine Berechnung durchführen müssen, um Ihre statischen Variablen zu initialisieren, können Sie einen statischen Block deklarieren, der beim ersten Laden der Klasse genau einmal ausgeführt wird.
- Sicherheitsprobleme oder Protokollierungsaufgaben
Einige Gründe, statische Blöcke NICHT zu verwenden (in anderen Situationen):
- Es gibt eine Einschränkung von JVM, dass ein statischer Initialisierungsblock 64 KB nicht überschreiten darf.
- Sie können keine geprüften Ausnahmen auslösen.
- Sie können das
this
Schlüsselwort nicht verwenden, da keine Instanz vorhanden ist.
- Sie sollten nicht versuchen, auf Super zuzugreifen, da es für statische Blöcke so etwas nicht gibt.
- Sie sollten nichts von diesem Block zurückgeben.
- Statische Blöcke machen das Testen zu einem Albtraum.
Ich sollte beachten: Während einige Sprachen (wie C #) möglicherweise eine Syntax für "Konstruktoren" haben, die statisch sind, funktionieren diese "Konstruktoren" ähnlich wie statische Initialisierungsblöcke in Java und werden von vielen (einschließlich mir) als angesehen Fehlbezeichnungen in der Sprache angesichts des Grundkonzepts eines OOP-Konstruktors .