— З цієї лекції ти дізнаєшся про завантаження класів до пам'яті.

Класи в Java – це файли на диску, що містять байт-код – скомпільований Java-код.

— Так, я пам'ятаю.

— Java-машина не завантажує їх без потреби. Як тільки десь у коді відбувається звернення до класу, Java-машина перевіряє – чи він завантажений. І якщо ні, то завантажує та ініціалізує його.

Ініціалізація класу – це присвоєння значень всіх його статичних змінних та виклик всіх статичних блоків.

— Схоже на виклик конструктора в об'єкта. А що таке статичний блок?

— Якщо для ініціалізації змінних об'єкта потрібно виконати складний код (наприклад, щось завантажити з файлу), ми можемо це зробити в конструкторі. Статичні змінні такої можливості не мають. Але оскільки потреба в цьому залишилася, до класів можна додати статичний блок або блоки, які по суті своїй еквівалентні виклику статичних конструкторів.

Ось як це виглядає:

Код Що відбувається насправді
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;

//статичні конструктори в Java
//заборонені, але якби вони були, то все
//виглядало б так
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");
}
}

Це дуже схоже на те, що відбувається під час виклику конструктора. Я навіть записав це у вигляді неіснуючого статичного конструктора.

— Так, я все зрозумів.

— Чудово.