Когда экземпляр класса создается сам по себе, то почему инструкции в конструкторе не выполняются?

#java #constructor #stack-overflow

#java #конструктор #stack-overflow

Вопрос:

При создании экземпляра класса вызывается его конструктор. В этом примере я хочу проверить, когда произошла ошибка StackOverflow. Но инструкции, объявленные внутри конструктора, не выполняются, почему? смотрите следующий код

 public class StackOverFlowSampleMain {
    StackOverFlowSampleMain oomeSampleMain = new StackOverFlowSampleMain();
    static int x = 0;

    StackOverFlowSampleMain() {
        x  ; //aren't these lines supposed to be executed?
        System.out.println(x);
    }

    public static void main(String[] args) {
        StackOverFlowSampleMain oomeSampleMain = new StackOverFlowSampleMain();

    }
}
  

Комментарии:

1. Не могли бы вы добавить немного исходного кода, пожалуйста?

2. Добавлен код, извините за неполный пост. Я новичок в размещении вопросов и, следовательно, обучаюсь

3. Конструктор выполняется сразу после oomeSampleMain инициализации — чего никогда не происходит.

4. Я понятия не имею, что здесь происходит. Это безумный поступок. Я бы не подумал, что это будет компилироваться. Это не может принести ничего хорошего. Когда вы создаете экземпляр ** StackOverFlowSampleMain** , он создаст свой член oomeSampleMain . Но это StackOverFlowSampleMain . Таким образом, это приведет к созданию его элемента oomeSampleMain . Но это объект StackOverFlowSampleMain . Таким образом, это приведет к созданию его элемента oomeSampleMain . И так далее, и так далее. Как вы думаете, что должен делать этот код?

5. Эта штука взрывается! Я просто запустил его, и он делает то, что я expected…it происходит сбой стека. — здесь происходит бесконечная рекурсия. Он никогда не выполняет код конструктора, потому что он никогда не заходит так далеко.

Ответ №1:

Инициализация элемента происходит перед телом конструктора. Итак, когда вы создаете StackOverFlowSampleMain экземпляр, первое, что он делает, это инициализирует его oomeSampleMain член. Он, в свою очередь, пытается инициализировать свой собственный oomeSampleMain член и так далее, пока программа не завершится сбоем с StackOverflowError , поэтому увеличение x просто никогда не достигается.

Если вы хотите измерить, когда StackOverflowError происходит, вы могли бы переместить код, который вызывает это, в конец конструктора:

 public class StackOverFlowSampleMain {
    StackOverFlowSampleMain oomeSampleMain;
    static int x = 0;

    StackOverFlowSampleMain() {
        x  ;
        System.out.println(x);
        oomeSampleMain = new StackOverFlowSampleMain(); // Here, after x is printed
    }
}
  

Комментарии:

1. Ну и дела… жаль, что я не подумал об этом! (tic) . [На самом деле это не имеет значения, но это отличный случай для того, чтобы щелкнуть по этому окошку «Сообщество Wiki», IMO ]