"Bună, Amigo! Am auzit că Rishi ți-a explicat ceva nou și incitant?!"

— Așa este, Kim.

"Subiectul meu nu va fi mai puțin interesant. Vreau să vă spun despre modul în care cursurile sunt încărcate în memorie."

Clasele în Java sunt fișiere de pe disc care conțin bytecode, care este cod Java compilat.

"Da imi amintesc."

Mașina Java nu le încarcă dacă nu este nevoie. De îndată ce există un apel către o clasă undeva în cod, mașina Java verifică dacă este încărcată. Și dacă nu, atunci se încarcă și îl inițializează.

Inițializarea unei clase implică alocarea de valori tuturor variabilelor sale statice și apelarea tuturor blocurilor de inițializare statică.

"Aceasta pare similar cu apelarea unui constructor pe un obiect. Dar ce este un bloc de inițializare static?"

„Dacă trebuie să executați cod complex (de exemplu, încărcarea a ceva dintr-un fișier) pentru a inițializa obiecte, o putem face într-un constructor. Totuși, variabilele statice nu au această oportunitate. Dar, deoarece nevoia rămâne, puteți adăugați un bloc de inițializare statică sau blocuri la clase. Ele sunt practic echivalente cu constructorii statici."

Așa arată:

Cod Ce se întâmplă cu adevărat
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");
}
}

Este foarte asemănător cu ceea ce se întâmplă când este apelat un constructor. L-am scris chiar ca un constructor static (inexistent).

"Da, inteleg."

"Foarte bun."