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

#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 Это имеет последствия для модели памяти.