"Ciao, Amigo! Ho sentito che Rishi ti ha spiegato qualcosa di nuovo ed eccitante?!"

"Esatto, Kim."

"Il mio argomento non sarà meno interessante. Voglio parlarti di come le classi vengono caricate in memoria."

Le classi in Java sono file sul disco che contengono bytecode, che è codice Java compilato.

"Si Ricordo."

La macchina Java non li carica se non è necessario. Non appena c'è una chiamata a una classe da qualche parte nel codice, la macchina Java controlla se è caricata. In caso contrario, lo carica e lo inizializza.

L'inizializzazione di una classe comporta l'assegnazione di valori a tutte le sue variabili statiche e la chiamata di tutti i blocchi di inizializzazione statici.

"Sembra simile a chiamare un costruttore su un oggetto. Ma cos'è un blocco di inizializzazione statico?"

"Se devi eseguire codice complesso (ad esempio, caricare qualcosa da un file) per inizializzare oggetti, possiamo farlo in un costruttore. Tuttavia, le variabili statiche non hanno questa opportunità. Ma poiché la necessità rimane ancora, puoi aggiungere uno o più blocchi di inizializzazione statici alle classi. Sono fondamentalmente equivalenti ai costruttori statici."

Ecco come appare:

Codice Cosa succede davvero
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");
}
}

È molto simile a ciò che accade quando viene chiamato un costruttore. L'ho persino scritto come un costruttore statico (inesistente).

"Sì capisco."

"Molto bene."