"Hallo, Amigo! Ik hoorde dat Rishi je iets nieuws en opwindends heeft uitgelegd?!"

"Dat klopt Kim."

"Mijn onderwerp zal niet minder interessant zijn. Ik wil je vertellen hoe klassen in het geheugen worden geladen."

Klassen in Java zijn bestanden op de schijf die bytecode bevatten, wat gecompileerde Java-code is.

"Ja dat herinner ik me."

De Java-machine laadt ze niet als dat niet nodig is. Zodra er ergens in de code een klasse wordt aangeroepen, controleert de Java-machine of deze is geladen. En zo niet, dan wordt het geladen en geïnitialiseerd.

Het initialiseren van een klasse omvat het toewijzen van waarden aan al zijn statische variabelen en het aanroepen van alle statische initialisatieblokken.

"Dat lijkt op het aanroepen van een constructor voor een object. Maar wat is een statisch initialisatieblok?"

"Als u complexe code moet uitvoeren (bijvoorbeeld iets uit een bestand laden) om objecten te initialiseren, kunnen we dit in een constructor doen. Statische variabelen hebben deze mogelijkheid echter niet. Maar aangezien de behoefte nog steeds bestaat, kunt u voeg een statisch initialisatieblok of blokken toe aan klassen. Ze zijn in principe gelijk aan statische constructors."

Zo ziet het eruit:

Code Wat gebeurt er echt
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");
}
}

Het lijkt veel op wat er gebeurt als een constructor wordt aangeroepen. Ik heb het zelfs geschreven als een (niet-bestaande) statische constructor.

"Ja ik snap het."

"Erg goed."