„Hallo Amigo! Ich habe gehört, dass Ritschie dir etwas Neues und Aufregendes erklärt hat?!“

„So ist es, Kim.“

„Mein Thema wird nicht weniger interessant sein. Ich möchte dir erzählen, wie Klassen in den Speicher geladen werden.“

Klassen in Java sind Dateien auf der Festplatte, die Bytecode enthalten, der wiederum kompilierter Java-Code ist.

„Ja, ich erinnere mich.“

Die Java-Maschine lädt sie nicht, wenn sie sie nicht braucht. Sobald irgendwo im Code eine Klasse aufgerufen wird, prüft die Java-Maschine, ob sie geladen ist. Und wenn nicht, dann lädt und initialisiert sie sie.

Die Initialisierung einer Klasse beinhaltet die Zuweisung von Werten zu allen statischen Variablen und den Aufruf aller statischen Initialisierungsblöcke.

„Das scheint ähnlich zu sein wie das Aufrufen eines Konstruktors mit einem Objekt. Aber was ist ein statischer Initialisierungsblock?“

„Wenn du komplexen Code ausführen musst (z.B. etwas aus einer Datei laden), um Objekte zu initialisieren, können wir dies in einem Konstruktor tun. Statische Variablen bieten diese Möglichkeit jedoch nicht. Da der Bedarf aber weiterhin besteht, kannst du einen oder mehrere statische Initialisierungsblöcke zu Klassen hinzufügen. Sie entsprechen im Grunde statischen Konstruktoren.“

Das sieht dann so aus:“

Code Das passiert tatsächlich
class Cat
{
public static int catCount = 0 ;
public static String namePrefix;

static
{
Properties p = new Properties();
p.loadFromFile("cat.properties");
namePrefix = p.get("name-prefix");
}

public static int maxCatCount = 50;

static
{
Properties p = new Properties();
p.loadFromFile("max.properties");
if (p.get("cat-max") != null)
maxCatCount = p.getInt("cat-max");
}

}


class Cat
{
public static int catCount;
public static String namePrefix;
public static int maxCatCount;

//Static constructors aren't allowed in Java,
//but if they were, everything
//would look like this
public static Cat()
{
catCount = 0;

Properties p = new Properties();
p.loadFromFile("cat.properties");
namePrefix = p.get("name-prefix");

maxCatCount = 50;

Properties p2 = new Properties();
p2.loadFromFile("max.properties");
if (p2.get("cat-max")!=null)
maxCatCount = p2.getInt("cat-max");
}
}

Das entspricht etwa dem, was passiert, wenn ein Konstruktor aufgerufen wird. Ich habe es sogar als (nicht existierenden) statischen Konstruktor geschrieben.

„Ja, ich verstehe.“

„Sehr gut.