Когда я пытаюсь создать объект с самоопределением в конструкторе, я получаю 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;
}
Поскольку статический объект будет инициализирован при загрузке класса, который он работает, я могу понять.
Но что происходит во время создания объекта, может ли кто-нибудь объяснить подробно?
Exampel1 создает новые экземпляры рекурсивно в конструкторе.
Статическое поле создается только один раз. Вот почему пример 1 создал переполнение, а второй - нет.
Статический модификатор подразумевает, что все, что вы сделали static, используется для всех объектов этого класса. Поскольку я считаю, что вы хотите сделать что-то вроде объекта по умолчанию внутри каждого объекта Example1, лучший способ сделать это - сделать его статическим. Таким образом, вы можете создать столько объектов Example1, сколько хотите (или ваша память позволяет), но каждый из них будет делиться статическим нулевым объектом Example1.
Нестационарный объект здесь невозможен, поскольку в противном случае он попытается создать другой объект Example1 внутри только что созданного объекта Example1, который, конечно же, будет иметь еще один объект Example1 в бесконечном цикле, как уже указывали другие люди.
Example2(int)
не называет себя self, тогда какExample1(int)
продолжает вызывать себя бесконечно