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");
    }
}
4
Задача
Java Core, 5 уровень, 7 лекция
Недоступна
Набираем код Ӏ Java Core: 5 уровень, 7 лекция
Внимание! Объявляется набор кода на JavaRush. Включите режим повышенной внимательности, расслабьте пальцы, читайте код и… набирайте его в соответствующем окошке. Набор кода — не бесполезное занятие, как может показаться на первый взгляд: вы привыкаете к синтаксису и запоминаете его (современные IDE редко дают вам это сделать).

Это очень похоже на то, что происходит при вызове конструктора. Я даже записала это в виде несуществующего статического конструктора.

— Да, я все понял.

— Отлично.

Комментарии (347)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Grigoryvvv Уровень 26 Expert
24 августа 2026
24.08.2026 / 25 уровень
Rei Уровень 32
3 марта 2026
написано так, будто автор сам понял и ушёл
16 февраля 2026
Есть кто-нибудь? а то последний комментарий от 19 августа 2025 года...
FosTeR Уровень 51
19 февраля 2026
Есть. 19.02.2026✔
20 февраля 2026
Ура, я тут не один) Догоняй)
Win32Trojan Уровень 30
13 августа 2026
Надеюсь еще можно догонять) а то тот парень тебя уже обогнал ))
23 августа 2026
Догоняй, я уже к стажировке готовлюсь в Тбанке)
Win32Trojan Уровень 30
24 августа 2026
Я тоже туда подавал) Но потом узнал, что там не всё так гладко от того кто уже там был) И призадумался )
Anonymous #3585174 Уровень 33
19 августа 2025
Like
Anonymous #3526086 Уровень 27
27 июля 2025
вот задачка с собеседований, запустив понятно что зачем вызывается public class StaticTrick { static { System.out.println("Static block 1"); } static int x = initializeX(); static { System.out.println("Static block 2, x = " + x); } int y = initializeY(); { System.out.println("Instance block, y = " + y); } public StaticTrick() { System.out.println("Constructor"); } private static int initializeX() { System.out.println("Initializing x"); return 10; } private int initializeY() { System.out.println("Initializing y"); return 20; } public static void main(String[] args) { System.out.println("Main start"); StaticTrick obj1 = new StaticTrick(); System.out.println("Main end"); } }
Alexander Уровень 12
8 мая 2025
Статический блок в Java — это специальный блок кода, который выполняется один раз при загрузке класса в память, ещё до создания объектов и до вызова любых методов. Он используется для инициализации статических переменных или выполнения кода, который должен быть выполнен только один раз для всего класса.

class MyClass {
    static {
        // Этот код выполнится один раз при загрузке класса
        System.out.println("Статический блок выполняется");
    }

    public static void main(String[] args) {
        System.out.println("main метод выполняется");
    }
}

Вывод:

Статический блок выполняется
main метод выполняется
Где используется: - Для инициализации сложных статических переменных (например, из файла или базы данных) - Для настройки класса перед его использованием Особенности: - Выполняется только один раз при первой загрузке класса. - Может быть несколько статических блоков, и они выполняются в порядке появления в коде. - Нельзя использовать нестатические переменные внутри статического блока.
Олег Сычев Уровень 4
8 мая 2025
Огромное спасибо! Статья большая и сложная, благодаря твоему комментарию - сразу все понятно!)
Евгений Уровень 7
1 мая 2025
Ни фига не понял , что это вообще было, Амиго ?
Vitalii Shevchenko Уровень 1
16 апреля 2025
Якщо теж не зрозуміли - https://www.youtube.com/watch?v=TdvnGw_KcFY
A_nanastya #1234567 Уровень 39 Expert
17 февраля 2025
-угу, хорошо,я понял.. *на самом деле.. я ничего.. не понял*
Antariko Уровень 1
14 января 2025
Спасибо, что на моём веку существуют нейросети, чтобы нормально объяснять подобные криво объясненные темы.