Блок инициализации Java и переменные экземпляра

В контексте моего предыдущего вопроса классы Java и статические блоки, что если я изменил свой код со статического блока и переменных на обычный блок инициализации экземпляра и переменные экземпляра. Теперь, как будет выполняться код?

class extra3 {
    public static void main(String string[]) {
        Hello123 h = new Hello123();
        System.out.println(h.a);
    }
}
class Hello123 {
    {
        a=20;
    }
    int a=158;
}

Здесь я получаю вывод как 158. Я не могу понять причину здесь. И другой код таков:

class extra3 {
    public static void main(String string[]) {
        Hello123 h = new Hello123();
        System.out.println(h.a);
    }
}
class Hello123 {
    int a=158;
    {
        a=20;
    }
}

Здесь вывод равен 20, что является приемлемым, поскольку при создании объекта сначала выполняется блок Instance. Но почему в первом коде выводится 158?

3 ответа

Решение

Это порядок инициализации

  1. Установите для полей начальные значения по умолчанию (0, false, null)
  2. Вызовите конструктор для объекта (но пока не выполняйте тело конструктора)
  3. Вызвать конструктор суперкласса
  4. Инициализируйте поля, используя инициализаторы и блоки инициализации
  5. Выполнить тело конструктора

Итак, когда вы инициализируете поля, оба встроенных инициализатора (a = 158) и блоки инициализации (a = 20) выполняются в порядке, как они определили.

Таким образом, в первом случае, встроенный инициализатор, выполненный после блока инициализации, вы получите 158 в качестве результата.

Во втором случае блок инициализации выполняется после встроенного инициализатора.

Статические блоки выполняются в порядке их объявления в коде. Эта статья поможет вам понять порядок выполнения статических и нестатических блоков инициализации

Заказ имеет значение.

Инициализация и статические блоки выполняются в соответствии с порядком их размещения в исходном коде. Вот в чем причина.

Другие вопросы по тегам