JavaRush/Курсы/Java Core/Порядок инициализации переменных

Порядок инициализации переменных

Открыта

— Привет, Амиго! Билаабо сегодня будет рассказывать о порядке инициализации переменных.

Представь, что ты видишь код. Какие значения получат переменные?

Код
class Cat
{
 public int a = 5;
 public int b = a + 1;
 public int c = a * b;
}
Код
class Cat
{
 public int a = getSum();
 public int b = getSum() - a;
 public int c = getSum() - a - b;

 public int getSum()
 {
  return a + b + c;
 }
}

— А разве так можно?

— Конечно. Порядок объявления между методами и полями класса неважен.

Класс загружается сверху вниз, поэтому важно, чтобы поле класса обращалось только к уже загруженным другим полям. В примере поле b может обращаться к a, но ничего не знает о c.

— И что же будет?

— Когда переменные создаются, они получают дефолтовые значения (значения по умолчанию).

Код Что происходит на самом деле
class Cat
{
 public int a = 5;
 public int b = a + 1;
 public int c = a * b;
}
class Cat
{
 public int a = 0;
 public int b = 0;
 public int c = 0;

 public Cat() { super();

 a = 5;
 b = a + 1; //5+1 = 6
 c = a * b; //5*6 = 30
 }
}
class Cat
{
 public int a = getSum();
 public int b = getSum() - a;
 public int c = getSum() - a - b;

 public int getSum()
 {
  return a + b + c;
 }
}
class Cat
{
 public int a = 0;
 public int b = 0;
 public int c = 0;

 public Cat() { super();

  a = getSum(); //(a+b+c)=0
  b = getSum() - a; //(a+b+c)-a=b=0
  c = getSum() - a - b; //(a+b+c)-a-b=c=0
 }

 public int getSum()
 {
  return a + b + c;
 }
}

— Ух ты! Оказывается, это так просто. Спасибо Билаабо, ты – настоящий друг!

— Ура! У Билаабо появился друг!

Комментарии (204)
  • популярные
  • новые
  • старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
Euraks Backend Developer
16 октября, 14:23
🦔
Grigoryvvv
Уровень 28
Expert
24 августа, 12:01
24.08.2026 / 25 уровень
Ni
Уровень 44
4 ноября 2025, 06:06
ИИшка переформулировала все более понятно, как мне кажется: ✅ Правильный порядок инициализации классов и объектов в Java: 1️⃣ Загрузка и инициализация класса (происходит один раз при первом использовании) Когда класс впервые используется, JVM загружает его в память. Затем выполняется инициализация всех статических полей и статических блоков, в порядке их объявления — сначала у базового класса, потом у дочернего. ⚙️ Это относится только к статическим членам (static). 2️⃣ Создание экземпляра (объекта) Когда вызывается new ClassName(), происходит следующее: Выделяется память под все нестатические (обычные) поля объекта — начиная с базового класса и до текущего. Все поля получают значения по умолчанию (0, false, null и т.п.). Выполняется конструктор базового класса, перед этим инициализируются его поля (в порядке объявления). Затем выполняется инициализация полей дочернего класса и его конструктор — тоже в порядке сверху вниз. 💡 Если у конструктора есть параметры: Они просто передаются в конструктор и используются при инициализации (например, в super(...) или в теле конструктора). ✍️ Кратко можно записать так: Загрузка класса → инициализация static полей и блоков. Создание объекта → выделение памяти → инициализация обычных полей (в порядке объявления). Вызов конструкторов: от базового к дочернему.
invoker main
Уровень 42
29 сентября 2025, 15:28
билаабо
Anonymous #3585174
Уровень 33
19 августа 2025, 09:57
like
Дмитрий
Уровень 24
3 мая 2025, 20:57
может кому то поможет. как у я это запомнил: 1) сперва выделяется место все поля, начиная с базового класса. И для статеческих полей и для обычных 2) Вызываются "условно" конструкторы для всех статических полей, начиная с базового класса. В том числе все статические блоки. Инициализация происходит в порядке их написания 3) Вызывается конструкторы для инциализации обычных полей, начиная с базового класса. Если при создании обьекта были параметры, то они добавляются в иеиуиализацию на этом этапе. Все
Дарья Frontend Developer
3 февраля 2025, 18:40
Не поняла, как получается, что можно инициализировать поле класса с помощью методов. Это предложение меня сильно смущает "Порядок объявления между методами и полями класса неважен." . Когда инициализруется методы, раз мы можем сделать так
public int a = getSum();
?
Павел К. System Engineer
5 марта 2025, 12:17
там в примере написано, что сначала инициируются переменные значением 0, а потом выполняется getSum с нулями.
KPR500
Уровень 33
31 января 2025, 11:36
--
NikitaMorozka
Уровень 38
20 ноября 2024, 17:08
Старушка с интересом рассматривает коляску: - Какие прелестные близнецы! Оба мальчика? - Нет, только слева, справа дыня.
{Java_Shark}
Уровень 36
4 октября 2024, 12:16
++