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

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

Java Core
5 уровень , 8 лекция
Открыта

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

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

Код
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;
 }
}

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

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

Комментарии (202)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Niru Ritsu Уровень 27
4 ноября 2025
ИИшка переформулировала все более понятно, как мне кажется: ✅ Правильный порядок инициализации классов и объектов в Java: 1️⃣ Загрузка и инициализация класса (происходит один раз при первом использовании) Когда класс впервые используется, JVM загружает его в память. Затем выполняется инициализация всех статических полей и статических блоков, в порядке их объявления — сначала у базового класса, потом у дочернего. ⚙️ Это относится только к статическим членам (static). 2️⃣ Создание экземпляра (объекта) Когда вызывается new ClassName(), происходит следующее: Выделяется память под все нестатические (обычные) поля объекта — начиная с базового класса и до текущего. Все поля получают значения по умолчанию (0, false, null и т.п.). Выполняется конструктор базового класса, перед этим инициализируются его поля (в порядке объявления). Затем выполняется инициализация полей дочернего класса и его конструктор — тоже в порядке сверху вниз. 💡 Если у конструктора есть параметры: Они просто передаются в конструктор и используются при инициализации (например, в super(...) или в теле конструктора). ✍️ Кратко можно записать так: Загрузка класса → инициализация static полей и блоков. Создание объекта → выделение памяти → инициализация обычных полей (в порядке объявления). Вызов конструкторов: от базового к дочернему.
invoker main Уровень 42
29 сентября 2025
билаабо
Anonymous #3585174 Уровень 33
19 августа 2025
like
Дмитрий Уровень 24
3 мая 2025
может кому то поможет. как у я это запомнил: 1) сперва выделяется место все поля, начиная с базового класса. И для статеческих полей и для обычных 2) Вызываются "условно" конструкторы для всех статических полей, начиная с базового класса. В том числе все статические блоки. Инициализация происходит в порядке их написания 3) Вызывается конструкторы для инциализации обычных полей, начиная с базового класса. Если при создании обьекта были параметры, то они добавляются в иеиуиализацию на этом этапе. Все
Дарья Уровень 30
3 февраля 2025
Не поняла, как получается, что можно инициализировать поле класса с помощью методов. Это предложение меня сильно смущает "Порядок объявления между методами и полями класса неважен." . Когда инициализруется методы, раз мы можем сделать так

public int a = getSum();
?
Павел К. Уровень 33
5 марта 2025
там в примере написано, что сначала инициируются переменные значением 0, а потом выполняется getSum с нулями.
KPR500 Уровень 33
31 января 2025
--
NikitaMorozka Уровень 38
20 ноября 2024
Старушка с интересом рассматривает коляску: - Какие прелестные близнецы! Оба мальчика? - Нет, только слева, справа дыня.
{Java_Shark} Уровень 36
4 октября 2024
++
Kaz Уровень 32
16 августа 2024
мне кажется в теме плохо раскрыто становление дружбы между Билабоо и Амиго.
Igoreek Уровень 43
4 августа 2024
Самое интересное, это то что инициализация происходит в конструкторе не смотря на то что инициализируются они сразу 🤯