Порядок загрузки классов, статические данные…

Открыта

— Привет, Амиго! Слышала, Риша рассказал тебе новую и очень интересную тему?!

— Да, Ким.

— Моя тема будет не менее интересной. Я хочу рассказать тебе о загрузке в память классов.

Классы в 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 редко дают вам это сделать).
Комментарии (174)
  • популярные
  • новые
  • старые
Для того, чтобы оставить комментарий вы должны авторизоваться
Миша16 уровень, Сранопипирск
24 июня, 08:33
Видео Раз статья, два статья. После этого даже статья на джавараш становится понятной. Если кратко, то все довольно просто и действительно похоже на конструктор для статической части класса. Суть в том что инициализация класса не происходит одновременно скопом. Сначала инициализируются статические переменные, затем срабатывают статические блоки, дальше нестатические поля, нестатические блоки и в конце конструктор. Это при создании экземпляра класса. Если идет обращение к статическому полю или методу, то нестатические поля, блоки и конструктор остаются в покое. Нас интересуют статические блоки, остановимся на них. Как при создании объекта срабатывает конструктор, так и при первом обращении к классу срабатывают статические блоки, в которых мы можем вызывать статические методы, инициализировать и менять значения статических полей и... и еще всякие штуки можно делать, наверное, про которые я не знаю пока. Это все нужно для того чтобы класс уже начал выполнять какие-то действия до того как его функционалом будут пользоваться другие классы. Важно понимать что это статик, так что работает это только один раз при первом обращении к классу. Писал так как я понял, возможно в чем-то ошибаюсь, поправьте, пожалуйста, если что)
Lev Afanasov20 уровень, Новосибирск
24 июня, 11:58
теперь понятно)
Юрий Лубенченко17 уровень, Киев
9 июля, 20:39
Спасибо!
Женька15 уровень, Гомель
среда, 17:55
стоит выделить пожирнее Важно понимать что это статик, так что работает это только один раз при первом обращении к классу.
Ivan18 уровень, Череповец
18 июня, 10:57
Пока читал, не покидало чувство, что это я уже читал. Было же, да?
Сергей16 уровень, Тюмень
23 июня, 01:11
Было в начале, но тогда акцент ставился на инициализации обычных переменных. Про статические блоки и инициализацию статических переменных было написано минимально, без объяснения что это и зачем.
Алексей16 уровень
26 мая, 17:25
Амиго эволюционирует на глазах! 😉 Не поспеваю за ним!
Paul22 уровень, Москва
23 мая, 19:51
"статические конструкторы в Java запрещены, но если бы они были, то все выглядело бы так..." Я давно начал подозревать что дядя Риша, Ким и прочие раньше кодили на другом языке (например С#). Разве сложно соблюдать синтакис Java, и писать скобку { в одной строке с сигнатурой класса, конструктора, метода?)) Думаю это не сложно! Вывод - они просто не знают этого правила!))
Sergey Zotov16 уровень, Челябинск
7 июня, 13:16
На самом деле конвенкций кода много :) Но, да, в офф конвенкции написано, что открывающая скобка для классов и методов должна начинаться с ними на одной строке.
Ivan D22 уровень
18 мая, 11:42
-Да, я все понял. -А я не понял ничего :)
Ruslan Semeniuk22 уровень, Bielsko-Biala
23 апреля, 17:37
Гораздо понятнее и доступнее! Подводим итог: -блоки инициализации используются для инициализации переменных внутри класса; -есть два типа блоков инициализации - статический и нестатический; -статический блок инициализации используется для статических переменных, нестатический - для всех остальных; -блоки инициализации делают код читабельнее, и позволяют вызывать любые методы. -синтаксис очень простой - просто пишем выражение внутри блока из двух скобок: для нестатического { //... } для статического: static { //... }
Ксенія Українка22 уровень, Киев
15 мая, 19:13
блоки инициализации используются для инициализации екземпляра класса - когда не статик. там может и не быть переменных (кстати, полей)
Михаил25 уровень, Воронеж
21 апреля, 20:40
Ничего не понял. Но очень интересно.
Raphael35 уровень, Москва
19 апреля, 00:46
- нет, я не понял
BariO16 уровень, Nizhniy Novgorod
17 апреля, 11:27
https://vertex-academy.com/tutorials/ru/bloki-inicializacii-v-java-chast-1/
Allan Teone25 уровень, Рамат Ган
25 апреля, 09:47
Отличная статья, спасибо
Александр 26 уровень, Екатеринбург
28 апреля, 05:15
А вот тут все понятно. Спасибо!
Pavel Lysenkov19 уровень, Тверь
29 апреля, 22:16
Ксенія Українка22 уровень, Киев
15 мая, 19:15
люблю когда в курсе есть ссылки на другие курсы)) невольно наводит на мысли )
Ivan D22 уровень
18 мая, 12:01
Благодарю! Теперь ясно, что, с чем и зачем.
Миша16 уровень, Сранопипирск
24 июня, 06:42
Dai bog tebe zdorov'ya;
Амиро20 уровень, хабаровск
5 апреля, 14:28