So verwendest du die Java Codeblöcke bzw. Initialisierungsblöcke
In diesem Beitrag geht es um den Einsatz von Java Codeblöcken oder Initialisierungsblöcken.
Viele Wege führen nach Rom.
Oder
Alle Wege führen nach Rom.
Heißt es in einem alten Sprichwort.
Und so ähnlich ist es bei der Java Programmierung.
In diesem Beitrag möchte ich dir einen weiteren Weg vorstellen, wie du Variablen eines Java Objektes initialisieren kannst.
Das ganze geschieht mit Initialisierungsblöcken.
Inhalt
Was sind Initialisierungsblöcke
Initialisierungsblöcke sind eigentlich nur Java Codeblöcke, welche du schon aus Methoden, Klassen oder Konstruktoren kennst.
Wenn du dir diese Beispiel Klasse „InitialisierungsBlock“ einmal anschaust.
Dann ist da nichts ungewöhnliches.
public class InitialisierungsBlock {
int zaehler; // Instanzvariable wird deklariert
public static void main(String[] args) {
InitialisierungsBlock blockEins = new InitialisierungsBlock();// neues Objekt wird angelegt
blockEins.zaehler = 2; // Der Instanzvariablen wird der Wert 2 zugewiesen
System.out.println(blockEins.zaehler); // Gibt Wert der Instanzvariablen zurück
}
}
Du hast eine Instanzvariable Zähler.
Einen Konstruktor und eine main-Methode für den Programmstart.
In der main-Methode wird ein Java Objekt erzeugt.
Dann wird der Wert der Instanzvariablen zugewiesen.
Und dieser Wert wird dann aus Kontrollzwecken über die Konsolenausgabe zurückgegeben.
Diese Vorgehensweise habe ich schon sehr ausführlich, in dem Einführungsbeispiel zur Java Programmierung, erläutert.
Also nichts Neues.
Aber das Ganze geht auch anders.
Und zwar kannst du Codeblöcke einsetzen und innerhalb dieser Codeblöcke den Variablen Werte zuweisen.
Und so sieht dies dann aus.
public class InitialisierungsBlock {
int zaehler; // Instanzvariable wird deklariert
{ // Codeblock weist den Wert der Instanzvariablen zu.
zaehler = 2;
}
public static void main(String[] args) {
InitialisierungsBlock blockEins = new InitialisierungsBlock();
System.out.println(blockEins.zaehler); // Gibt Wert vom Zähler zurück
}
}
So ein Codeblock wird über eine öffnende Klammer geöffnet.
Dann erfolgt die Anweisung. (Zuweisung des Wertes)
Und zum Schluss schließt du den Codeblock über eine Klammer.
Und innerhalb des Blockes kannst du sämtliche Anweisungen platzieren.
Diese werden dann automatisch ausgeführt, sobald du eines neues Java Objekt anlegst.
Somit kann die println()-Anweisung, welche den Zählerwert zurückgibt aus der main-Methode verschwinden.
Und stattdessen wird diese im Codeblock untergebracht.
public class InitialisierungsBlock {
int zaehler; // Instanzvariable wird deklariert
{ // Codeblock weist den Wert der Instanzvariablen zu.
zaehler = 2;
System.out.println(zaehler); // Gibt Wert vom Zähler zurück
}
public static void main(String[] args) {
InitialisierungsBlock blockEins = new InitialisierungsBlock();
InitialisierungsBlock blockZwei = new InitialisierungsBlock();
InitialisierungsBlock blockDrei = new InitialisierungsBlock();
}
}
Jedes Mal, sobald ein Objekt angelegt wird, wird jetzt der Wert der Instanzvariablen zurückgegeben.
Cool, oder?
Und natürlich kannst du in diesen Codeblöcken auch auf alle Java Klassenvariablen zugreifen
Nur ganz kurz.
Im Beispiel habe ich eine zweite Variable, eine Klassenvariable, angelegt.
Und auch bei dieser wird der Wert im Codeblock verändert und dann zurückgegeben.
public class InitialisierungsBlock {
int zaehler; // Instanzvariable wird deklariert
static int zaehlerZwei; //Klassenvariable
{ // Codeblock weist den Wert der Instanz- und Klassenvariablen zu.
zaehler = 2;
zaehlerZwei=15;
System.out.println("zaehler="+zaehler); // Gibt Wert vom Zähler zurück
System.out.println("zaehlerZwei="+zaehlerZwei);//Gibt den Wert der Klassenvariable zurück
}
public static void main(String[] args) {
InitialisierungsBlock blockEins = new InitialisierungsBlock();
InitialisierungsBlock blockZwei = new InitialisierungsBlock();
InitialisierungsBlock blockDrei = new InitialisierungsBlock();
}
}
Neben den Codeblöcken für Instanzen existieren auch noch Codeblöcke für Klassen
Statische Codeblöcke werden durch das Java Keywort static gekennzeichnet.
Im statischen Kontext kannst du nicht ohne weiteres auf Instanzvariablen zugreifen.
Wie auch in statischen Methoden, muss dann innerhalb des Codeblockes eine Instanz bzw. ein Objekt erzeugt werden.
public class InitialisierungsBlock {
int zaehler; // Instanzvariable wird deklariert
static int zaehlerZwei; // Klassenvariable
static { // Codeblock weist den Wert der Instanz- und der Klassenvariablen zu.
InitialisierungsBlock blockVier = new InitialisierungsBlock();
blockVier.zaehler = 2;
zaehlerZwei = 15;
System.out.println("zaehler=" + blockVier.zaehler);
System.out.println("zaehlerZwei=" + zaehlerZwei);
}
public static void main(String[] args) {
}
}
Der statische Codeblock wird allerdings nur einmal ausgeführt.
Und zwar bei der Klassen Initialisierung.
Du kannst beliebig viele Java Objekte erzeugen – Dieser Block wird nur einmal durchlaufen.
In beiden Codeblöcke würden auch lokale Java Variablen existieren
Du könntest zum Beispiel eine lokale Variable anlegen und dir deren Wert zurückgeben lassen.
Wichtig ist die Tatsache, dass diese lokale Variable außerhalb nicht existiert.
Durch die schließende Klammer des Codeblockes wird diese Java Variable zerstört.
public class InitialisierungsBlock {
static {
int x =22;
System.out.println(x);
}//Zerstörung der lokalen Variablen
static {//zweiter Codeblock hat keinen Zugriff auf x
System.out.println(x);//Fehlermeldung
}
public static void main(String[] args) {
}
}
Der zweite Codeblock hat deshalb keinen Zugriff mehr auf diese Variable.
Auch in der main-Methode kannst du diese lokale Variable nicht verwenden.
Das gleiche Prinzip gilt bei der Schachtelung von Codeblöcken
Lokale Variable existieren nur nach unten, nicht nach oben.
Was heißt das?
Dazu zwei Beispiele.
public class InitialisierungsBlock {
static {
int x = 22;
{
System.out.println(x);//Funktioniert
}
}
public static void main(String[] args) {
}
}
In diesem Beispiel wurde die lokale Variable x auf oberste Ebene des Codeblockes angelegt.
Diese existiert weiterhin auch in hierarchisch unterliegenden Ebenen.
public class InitialisierungsBlock {
static {
{//Öffnung zweite Ebene
int x = 22;
} //Schließung zweite Ebene und Zerstörung der lokalen Variablen
System.out.println(x);//Funktioniert nicht
}
public static void main(String[] args) {
}
}
Dieses Beispiel funktioniert nicht, da die lokale Variable in einer untergeordneten Ebene angelegt wurde.
Und dann kannst du auf einer hierarchisch höheren Ebene nicht auf diese zugreifen.
Zusammenfassung:
- Java Codeblöcke lassen sich direkt in der Klassenebene einbinden.
- Java bietet dir Codeböcke für den statischen, als auch für den nichtstatischen Kontext an.
- Die Codeblöcke lassen sich außerdem schachteln.