"Olá, amigo! Ouvi dizer que Rishi explicou algo novo e empolgante para você?!"

"Isso mesmo, Kim."

"Meu tópico não será menos interessante. Quero falar sobre como as classes são carregadas na memória."

As classes em Java são arquivos no disco que contêm bytecode, que é um código Java compilado.

"Sim eu lembro."

A máquina Java não os carrega se não for necessário. Assim que houver uma chamada para uma classe em algum lugar do código, a máquina Java verifica se ela foi carregada. E se não, ele carrega e inicializa.

Inicializar uma classe envolve atribuir valores a todas as suas variáveis ​​estáticas e chamar todos os blocos de inicialização estáticos.

"Isso parece semelhante a chamar um construtor em um objeto. Mas o que é um bloco de inicialização estático?"

"Se você precisar executar um código complexo (por exemplo, carregar algo de um arquivo) para inicializar objetos, podemos fazê-lo em um construtor. No entanto, variáveis ​​estáticas não têm essa oportunidade. Mas como a necessidade ainda permanece, você pode adicione um ou mais blocos de inicialização estática às classes. Eles são basicamente equivalentes a construtores estáticos."

Isto é o que parece:

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

É muito parecido com o que acontece quando um construtor é chamado. Eu até o escrevi como um construtor estático (inexistente).

"Sim entendo."

"Muito bom."