Вопрос №670 от пользователя Михаил Соколовский в уроке «Модуль 5. Урок 5. Перечисления в Java.», курс «Введение в Java»
Почему в данном примере "х" выводится на печать два раза подряд и только потом измененное значение поля count?
public class printFigure {
static Figure f;
public static void main(String[] args) {
System.out.print(f.KRESTIK.count + " " + f.Nolik.count + " ");
}
}
enum Figure {
KRESTIK, Nolik;
int count = 0;
Figure() {
System.out.print("x ");
count = count + 1;
}
}
Дело в том что в перечислении Figure есть два инстанса: KRESTIK, Nolik. Оба они буду созданы ровно в тот момент когда будет первое обращение к перечислению Figure (не зависимо от условий обращений). А соотвественно при первом обращении Вы увидеть на экране два раза текст "х ". А так же в этот момент в ОБОИХ инстансах "count" уже будет увеличен.
Не совсем очевидный пример. То есть даже при первом обращении к полю count
вначале на экран будет выведено "х х", а уже потом значение этого поля? И второе, почему, если вместо строчки System.out.print(f.KRESTIK.count + " " + f.Nolik.count + " ");
написать что-то вроде System.out.print(f.KRESTIK);
на экране, вместо сообщения "х х", появится "х х KRESTIK"?
При первом обращении к полю count произойдет следующее:
- Джава увидит что произошло обращение к перечислению которе еще не загружено в оперативную память
- Перечисление будет загружено в оперативную память (enum Figure)
- Джава начнет создавать все экземпляры данного перечисления (KRESTIK, Nolik)
- В момент создания каждого из экземпляров будет выведен на экран "х" а так же у каждого из экземпляров будет изменено значение поля count
- только теперь перечисление окончательно загруженно в оперативную память и можно закончить обращение которое и стало толчком ко всем описанным процедурам (пункт №1)
Это и объясняет почему Вы видите "х х KRESTIK" при выполнении кода:
System.out.print(f.KRESTIK);
enum отличается от обычных классов не только тем, что невозможно создать новые инстансы enum, но и тем, что Java в энамы добавляет всякие вкусности. В частности будет создан кастомный toString, который будет возвращать имя данного инстанса.
Если я правильно понял, f.KRESTIK
, помимо выполнения шагов 1-5, должен вернуть имя данного инстанса?
Верно.
Т.е. верно ли будет сказать, что при static Figure f; создается ссылка на область памяти, где ничего нет, пусто. А при вызове f.KRESTIK.count в момент "f." в зарезервированное место в озу уже запишутся все указанные экземпляры инстансов?
почти так, Java создаст в ОЗУ все инстансы enum в момент когда она будет подгружать сам enum в память из класс-файла. Иными словам первой встречи Figure в любом виде, в ОЗУ будут созданы все экземпляры enum и останутся там до конца работы программы (даже если к ним ни разу не обратились)
Без этих комментариев я бы не разобрался в чем дело =)
зашел сюда именно за этим же комментом), тонкая штука про работу java с оперативкой, много где встречал описание работы enum, но этой фишки про одновременное создание всех экземпляров не видел. Спасибо. А вообще грустно получается: жрать оперативку на несчислемое множество объектов, даже если ты ими в данный момент и не пользуешься. Выходит необходимо очень быстро подчищать эти enum(ы), если ты их бросил попользовав, или нехай висят и ресурсов не жалко?
Используйте Хекслет по максимуму!
- Задавайте вопросы по уроку
- Проверяйте знания в квизах
- Проходите практику прямо в браузере
- Отслеживайте свой прогресс
Зарегистрируйтесь или войдите в свой аккаунт
С нуля до разработчика. Возвращаем деньги, если не удалось найти работу.







