"Здравей, Амиго! Чух, че Риши ти е обяснил нещо ново и вълнуващо?!"

— Точно така, Ким.

„Моята тема ще бъде не по-малко интересна. Искам да ви разкажа за това How класовете се зареждат в паметта.“

Класовете в Java са файлове на диска, които съдържат byte code, който е компorран Java code.

"Да аз помня."

Java машината не ги зарежда, ако не е необходимо. Веднага щом някъде в codeа има извикване на клас, Java машината проверява дали е заредена. И ако не, тогава го зарежда и инициализира.

Инициализирането на клас включва присвояване на стойности на всички негови статични променливи и извикване на всички статични блокове за инициализация.

„Това изглежда подобно на извикване на конструктор на обект. Но Howво е блок за статична инициализация?“

„Ако трябва да изпълните сложен code (например да заредите нещо от файл), за да инициализирате обекти, можем да го направим в конструктор. Статичните променливи обаче нямат тази възможност. Но тъй като нуждата все още остава, можете добавете блок or блокове за статична инициализация към класовете. Те са основно еквивалентни на статичните конструктори."

Ето How изглежда:

Код Какво наистина се случва
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");
}
}

Много прorча на това, което се случва, когато се извика конструктор. Дори съм го написал като (несъществуващ) статичен конструктор.

— Да, разбрах.

"Много добре."