Почему мы не можем создать нестатический самоссылочный объект в конструкторе

1

Когда я пытаюсь создать объект с самоопределением в конструкторе, я получаю StackOverflowError.

public class Example1 {
    private int i;
    private Example1 zero;

    public Example1(int i) {
        super();
        if (i > 0) {
            this.i = i;
        } else {
            this.i = this.zero.i;
        }
        this.zero = new Example1(i);
    }

    public int getI() {
        return i;
    }

Но когда я делаю статическую ссылку, ошибка не возникает.

public class Example2 {
    private int i;
    private static final Example2 ZERO = new Example2(0);

    public Example2() {
        this(ZERO.i);
    }

    public Example2(int i) {
        super();
        this.i = i;
    }

    public int getI() {
        return i;
    }

Поскольку статический объект будет инициализирован при загрузке класса, который он работает, я могу понять.

Но что происходит во время создания объекта, может ли кто-нибудь объяснить подробно?

  • 0
    Оба кода одинаковы? Я думаю, нет.
  • 3
    Example2(int) не называет себя self, тогда как Example1(int) продолжает вызывать себя бесконечно
Показать ещё 2 комментария
Теги:
static
self-reference

2 ответа

12
Лучший ответ

Exampel1 создает новые экземпляры рекурсивно в конструкторе.

Статическое поле создается только один раз. Вот почему пример 1 создал переполнение, а второй - нет.

  • 0
    Так является ли вызов конструктора просто вызовом метода со специальным синтаксисом?
  • 0
    @harinewton что ты на самом деле пытаешься достичь? У вас есть несвязанная рекурсия, она рухнет, независимо от того, заключите ли вы ее в метод, конструктор или что-то еще.
Показать ещё 4 комментария
0

Статический модификатор подразумевает, что все, что вы сделали static, используется для всех объектов этого класса. Поскольку я считаю, что вы хотите сделать что-то вроде объекта по умолчанию внутри каждого объекта Example1, лучший способ сделать это - сделать его статическим. Таким образом, вы можете создать столько объектов Example1, сколько хотите (или ваша память позволяет), но каждый из них будет делиться статическим нулевым объектом Example1.

Нестационарный объект здесь невозможен, поскольку в противном случае он попытается создать другой объект Example1 внутри только что созданного объекта Example1, который, конечно же, будет иметь еще один объект Example1 в бесконечном цикле, как уже указывали другие люди.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню