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

Открыта

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

— Да, Ким.

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

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

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

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

— Отлично.

Комментарии (204)
  • популярные
  • новые
  • старые
Для того, чтобы оставить комментарий вы должны авторизоваться
🦔 Виктор админ Java Android канала в telegram @LetsCodeItExpert
10 января, 05:52
— Да, я все понял. — Чего? Что ты там понял, я вот ничего не понял! Более-менее становится понятно после следующих материалов: 1. Блоки инициализации в Java - Часть 1 (Vertex Academy). 2. Статический блок в Java (VS Code). 3. 4. Всё получится! -- tlgrm: @LetsCodeIt | @SefoNotasi
Yuliya 17 уровень
24 января, 18:29
Спасибо за ссылки, я тоже совсем не поняла статью.)))
garib aghayev 22 уровень
24 января, 21:05
чувак) ты просто космос
Илья Работает в Diler.ru
26 декабря 2020, 18:23
Больше всего на всех уровнях и самая сложная/ раздражающая задача: "Набираем код...". Мы ведь дальше его не набираем ))) лучше с пяток легких задач подгрузили )) а то думаешь не о структуре кода, а о том как бы букву не пропустить или другую не вбить)))))
Александр Долженко 16 уровень, Лондон
20 января, 17:52
ctrl+c -> ctrl+v. А что кто-то набирает?
Александр Черенков 16 уровень, Бердск
22 января, 08:13
Я тренируюсь для набора 10 пальцами не глядя на клавиатуру.
Veygard 22 уровень, Москва
23 декабря 2020, 14:42
Порядок инициализации классов и создания объекта: Инициализация класса: 1. Статические блоки и статические поля класса-родителя (по очереди расположения в коде). 2. Статические блоки и статические поля класса. При создании объекта(дальше): 3. Блоки инициализации класса-родителя и не статические поля класса. (по очереди расположения в коде). 4. Конструктор класса-родителя 5. Блоки инициализации класса Конструктор класса. на примере в коде:
Бельчонок Изи 18 уровень, Казань
25 декабря 2020, 12:22
Спасибо! Но есть небольшая несостыковка между оутпутом и кодом там, где init block и normal var (но это, конечно, тут не принципиально). И я бы добавила в 3 пункте "и не статические поля класса-родителя", иначе не сразу очевидно про какой класс все-таки идет речь: про родителя или потомка :)
Veygard 22 уровень, Москва
25 декабря 2020, 12:59
Да, речь шла о статических полях класса родителя.
Алексей 20 уровень, Night city
4 ноября 2020, 10:27
В примере эта строка находится вне статического блока
public static int maxCatCount = 50;
Почему же она включена в конструктор а не вынесена за его пределы? В чем тогда разница между статическими переменными занесенными в блок и не занесенными в блок?
Кирилл Струков 20 уровень, Минск
14 ноября 2020, 14:05
В том, что в статических блоках можно присваивать одинаковым переменным новые объекты, чтобы не плодить дополнительные переменные?
yurii 18 уровень
12 октября 2020, 07:56
Инициализация класса происходит при первом обращении к классу. Инициализация класса - присвоение значений всем статическим переменным и инициализация статических блоков. Статический блок будет выполнен один раз, при первом обращении к классу, еще до того как класс будет использоваться, то есть до создания экземпляров, вызова статических методов, обращения к полям. Нестатический блок срабатывает каждый раз при создании нового объекта. Равнозначные блоки исполняются сверху вниз. Порядок инициализации блоков и переменных: 1. Статические блоки и переменные родителя; 2. Статические блоки и переменные наследника; 3. Нестатические блоки и переменные родителя; 4. Конструктор родителя; 5. Нестатические блоки и переменные наследника; 6. Конструктор наследника. Пункты 3-6 выполняются только и при каждом создании экземпляра.
Кирилл Струков 20 уровень, Минск
14 ноября 2020, 14:06
Вот это очень важный текст! Спасибо!
Vesa 18 уровень, Калининград
11 декабря 2020, 14:21
В пункты 1, 2, 3, 5 ещё можно добавить фразу "в порядке их объявления в классе".
Future Man 22 уровень
11 октября 2020, 05:06
очередная халтура....
Дмитрий 20 уровень, Москва
12 сентября 2020, 10:20
В последнем примере разве все статические поля не должны быть первыми проинициализированы значениями по умолчанию, а только затем выполнялся статический блок, в котором эти значения мы меняем?
yurii 18 уровень
12 октября 2020, 13:54
код сверху вниз исполняется
Dmitry Nikolsky 24 уровень, Косовска-Митровица
16 августа 2020, 13:30
ЫА
Dmitry Nikolsky 24 уровень, Косовска-Митровица
16 августа 2020, 13:30
.
Erik 25 уровень, Новосибирск
8 августа 2020, 12:35
Использование статических методов генерации, а так же преимущества и недостатки такого подхода описаны в самом начале книги Джошуа Блоха "Эффективное программирование 2-е издание", так что если есть вопросы - крайне рекомендую к ознакомлению.
Алексей 16 уровень, Москва
27 августа 2020, 21:42
Спасибо
Ilya Britkov 27 уровень, Минск
10 сентября 2020, 12:42
скачать книгу можно тут