#java #initialization #instance
#java #инициализация #экземпляр
Вопрос:
Я задаю вопрос, который является довольно распространенным в Java
, но, к сожалению, я не смог найти ответ или ресурс, предоставляющий полный структурированный ответ на этот вопрос. Я хотел бы знать, каков полный процесс инициализации (объекта) в Java и каков его порядок? В paticular я не уверен, когда переменные экземпляра получают свои значения по умолчанию и их значения при инициализации. Насколько я знаю, порядок инициализации в типичном классе, т.е. A
является:
class B {
}
class A extends B {
int x = 5;
public A() {
...
}
}
1) блок статической инициализации (при условии, что он существует)
2) вызвать super()
конструктор
3) блок инициализации экземпляра (при условии, что он существует)
4) исключите остальную часть конструктора
В какой момент в указанном выше порядке инициализация по умолчанию ( x=0
) и фактическая инициализация ( x=5
) попадают в список?
Комментарии:
1. В этом коде нет инициализации по умолчанию.
2. Смотрите docs.oracle.com/javase/specs/jls/se8/html/jls-12.html#jls-12.5
3. @OliCharlesworth: Да, есть.
x
будет иметь значение 0 — по крайней мере, условно — во время выполнения суперконструктора. Недавний вопрос предполагает, что некоторые JVM могут оптимизировать это (на мой взгляд, нарушая JLS), но это указано в JLS.4. @JonSkeet: Интересно, спасибо! Однако, разве «условный» здесь не очень важен? (Я бы предположил, что независимо от того, происходит это на самом деле или нет, это не оказывает заметного влияния на программу.)
5. @Oli Это имеет последствия для модели памяти.