"¡Hola, amigo! ¡¿Escuché que Rishi te explicó algo nuevo y emocionante?!"

"Así es, Kim".

"Mi tema no será menos interesante. Quiero contarles cómo se cargan las clases en la memoria".

Las clases en Java son archivos en el disco que contienen bytecode, que es código Java compilado.

"Sí, lo recuerdo."

La máquina Java no los carga si no es necesario. Tan pronto como hay una llamada a una clase en algún lugar del código, la máquina Java verifica si está cargada. Y si no, lo carga y lo inicializa.

Inicializar una clase implica asignar valores a todas sus variables estáticas y llamar a todos los bloques de inicialización estáticos.

"Eso parece similar a llamar a un constructor en un objeto. Pero, ¿qué es un bloque de inicialización estático?"

"Si necesita ejecutar código complejo (por ejemplo, cargar algo desde un archivo) para inicializar objetos, podemos hacerlo en un constructor. Sin embargo, las variables estáticas no tienen esta oportunidad. Pero dado que la necesidad aún persiste, puede agregue un bloque o bloques de inicialización estáticos a las clases. Son básicamente equivalentes a los constructores estáticos".

Así es como se ve:

Código lo que realmente sucede
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");
}
}

Es muy parecido a lo que sucede cuando se llama a un constructor. Incluso lo he escrito como un constructor estático (inexistente).

"Si lo entendi."

"Muy bien."