wake-up-neo.com

Statischer Block vs. Initialisierungsblock in Java?

Mögliches Duplikat:
Statische Initialisierungsblöcke

Betrachten Sie den folgenden Code:

public class Test {
    {
        System.out.println("Empty block");
    }
    static {
        System.out.println("Static block");
    }
    public static void main(String[] args) {
        Test t = new Test();
    }
}

Wir verstehen, dass zuerst der Block static ausgeführt wird, gefolgt vom Block empty. Aber das Problem ist, dass ich nie in der Lage war, den wahren Nutzen eines leeren Blocks zu verstehen. Kann jemand ein reales Beispiel zeigen, in dem -

  • Beide Blöcke static und empty werden verwendet
  • Beide statisch und leer Blöcke haben unterschiedliche Hilfsprogramme
78
Anshu

Sie dienen zwei sehr unterschiedlichen Zwecken:

  • Der statische Initialisierungsblock wird beim Laden der Klasse aufgerufen und hat keinen Zugriff auf Instanzvariablen oder -methoden. Gemäß @Prahalad Deshpandes Kommentar wird es häufig verwendet, um statische Variablen zu erstellen.
  • Der nicht-statische Initialisierungsblock hingegen wird nur für die Objektkonstruktion erstellt, hat Zugriff auf Instanzvariablen und Methoden und wird (gemäß der von @EJP vorgeschlagenen wichtigen Korrektur) am Anfang des Konstruktors nach dem aufgerufen super constructor wurde (explizit oder implizit) und vor jedem anderen nachfolgenden Konstruktorcode aufgerufen. Ich habe gesehen, dass es verwendet wird, wenn eine Klasse mehrere Konstruktoren hat und denselben Initialisierungscode benötigt, der für alle Konstruktoren aufgerufen wird. Wie bei Konstruktoren sollten Sie es vermeiden, nicht endgültige Methoden in diesem Block aufzurufen.

Beachten Sie, dass diese Frage im Stapelüberlauf oft beantwortet wurde und Sie die ähnlichen Fragen und ihre Antworten gut durchsuchen und überprüfen sollten. Zum Beispiel: statische Initialisierungsblöcke

Der statische Block wird ausgeführt, wenn Ihre Klasse geladen wird. Der leere Block wird immer dann ausgeführt, wenn Sie Ihre Klasse instanziieren. Vergleichen Sie diese:

1.

public static void main(String[] args) {
    Test t = new Test();
}

2.

public static void main(String[] args) {

}

Ausgänge:

1.

Statischer Block
Leerer Block

2.

Statischer Block

In Laienwörtern wird der statische Block nur einmal aufgerufen, unabhängig davon, wie viele Objekte dieses Typs Sie erstellen.

24
arshajii