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

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

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

— Отлично.

Комментарии (346)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Antariko Уровень 30
14 января 2025
Спасибо, что на моём веку существуют нейросети, чтобы нормально объяснять подобные криво объясненные темы.
ВК Уровень 36
7 декабря 2024
Статья полезная, но в примерах нет отступов, тяжело читать. В упражнениях на набор когда я набираю фигурную скобку, делается автоподстановка и закрывающей скобки, но поле ввода тут же подсвечивает красным, мол, неправильное действие, потому для контроля набора мне приходится эту закрывающую скобку тут же удалять. Неудобно. Потому, если уж это хардкорный тренажер набора кода в блокноте, то и автоподстановку скобок уберите (а лучше уберите упражнения на набор вовсе).
mikeudin Уровень 26
21 ноября 2024
NikitaMorozka Уровень 38
20 ноября 2024
Встречаются две бабки. Одна у другой спрашивает: - Чойта у тебя дед орет? - Да у него зубы лезут. - Какие зубы, ему же уже 70? - Да он вставную челюсть проглотил.
mikeudin Уровень 26
21 ноября 2024
Тянет на статью
{Java_Shark} Уровень 35
4 октября 2024
++
Антон Карпов Уровень 32
14 сентября 2024
А если объединить эту инфу с предыдущей лекцией, то получается такая инициализация: 1. Статические переменные базового класса 2. Статический блок базового класса 3. Статические переменные дочернего класса 4. Статический блок дочернего класса 5. Нестатические переменные базового класса 6. Обычный блок базового класса 7. Конструктор базового класса 8. Нестатические переменные дочернего класса 9. Обычный блок дочернего класса 10. Конструктор дочернего класса
FolFix Уровень 37
2 сентября 2024
Так вот оно что!
Saidash Уровень 30
5 мая 2024
Кому тяжело понять, может поможет. Кратко говоря, при загрузке класса в память, у нас инициализируются статические переменные. Так вот, если нужно реализовать сложную логику инициализации, которая не поместится в одну строку справа от знака равно, то мы можем воспользоваться статическим блоком, некий черновик, где мы делаем какие-то действия, дабы можно было инициализировать статические переменные. Допустим, достать данные из какого-то файла и присвоить их статическим переменным. Может это объяснение совсем на пальцах, но может кому-то поможет въехать в суть.
Cвят Уровень 29
25 мая 2024
пример получше:

public class Example {
    // Статическая переменная
    static String staticValue;

    // Статический блок инициализации
    static {
        System.out.println("Статический блок инициализации выполняется.");
        // Инициализация статической переменной
        staticValue = "Hello, world!";
    }

    // Конструктор
    public Example() {
        System.out.println("Конструктор объекта выполняется.");
    }

    public static void main(String[] args) {
        System.out.println("Статическая переменная перед созданием объекта: " + staticValue);
        
        // Создание объекта
        Example example = new Example();
        
        // Доступ к статической переменной через объект
        System.out.println("Статическая переменная после создания объекта: " + example.staticValue);
    }
}

Light_Day :) Уровень 51
28 мая 2024
благодарочка
Yusufali Уровень 1
26 апреля 2024
как я понял если ты будешь учиться только по этому курсу то ты будешь учиться всю жизнь и все равно ничего не понимать
9 августа 2024
Аминь.
Luckyhunter Уровень 30 Expert
3 апреля 2024
Что за... почему весь этот блок написан так непонятно, в сравнении с синтаксисом.
9 августа 2024
Синтаксис обновили до PRO, а тут пока нет...