Блок инициализации 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 ответа
Это порядок инициализации
- Установите для полей начальные значения по умолчанию (0, false, null)
- Вызовите конструктор для объекта (но пока не выполняйте тело конструктора)
- Вызвать конструктор суперкласса
- Инициализируйте поля, используя инициализаторы и блоки инициализации
- Выполнить тело конструктора
Итак, когда вы инициализируете поля, оба встроенных инициализатора (a = 158
) и блоки инициализации (a = 20
) выполняются в порядке, как они определили.
Таким образом, в первом случае, встроенный инициализатор, выполненный после блока инициализации, вы получите 158 в качестве результата.
Во втором случае блок инициализации выполняется после встроенного инициализатора.
Статические блоки выполняются в порядке их объявления в коде. Эта статья поможет вам понять порядок выполнения статических и нестатических блоков инициализации
Заказ имеет значение.
Инициализация и статические блоки выполняются в соответствии с порядком их размещения в исходном коде. Вот в чем причина.