JavaRush /Курси /Java Core /Порядок завантаження класів, статичні дані

Порядок завантаження класів, статичні дані

Java Core
Рівень 5 , Лекція 7
Відкрита

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

Класи в 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");
    }
}

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

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

— Чудово.

Коментарі
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ