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 редко дают вам это сделать).

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

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

— Отлично.

Комментарии (357)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Rei Уровень 26
3 марта 2026
написано так, будто автор сам понял и ушёл
16 февраля 2026
Есть кто-нибудь? а то последний комментарий от 19 августа 2025 года...
FosTeR Уровень 29
19 февраля 2026
Есть. 19.02.2026✔
20 февраля 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 Уровень 1
8 мая 2025
Статический блок в Java — это специальный блок кода, который выполняется один раз при загрузке класса в память, ещё до создания объектов и до вызова любых методов. Он используется для инициализации статических переменных или выполнения кода, который должен быть выполнен только один раз для всего класса.

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

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

Вывод:

Статический блок выполняется
main метод выполняется
Где используется: - Для инициализации сложных статических переменных (например, из файла или базы данных) - Для настройки класса перед его использованием Особенности: - Выполняется только один раз при первой загрузке класса. - Может быть несколько статических блоков, и они выполняются в порядке появления в коде. - Нельзя использовать нестатические переменные внутри статического блока.
Олег Сычев Уровень 15
8 мая 2025
Огромное спасибо! Статья большая и сложная, благодаря твоему комментарию - сразу все понятно!)
Евгений Уровень 37
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
Спасибо, что на моём веку существуют нейросети, чтобы нормально объяснять подобные криво объясненные темы.
ВК Уровень 36
7 декабря 2024
Статья полезная, но в примерах нет отступов, тяжело читать. В упражнениях на набор когда я набираю фигурную скобку, делается автоподстановка и закрывающей скобки, но поле ввода тут же подсвечивает красным, мол, неправильное действие, потому для контроля набора мне приходится эту закрывающую скобку тут же удалять. Неудобно. Потому, если уж это хардкорный тренажер набора кода в блокноте, то и автоподстановку скобок уберите (а лучше уберите упражнения на набор вовсе).