Нам нужно знать, что происходит внутри конструктора, чтобы полностью ответить на вопрос.
Но обычно, пока ничто не сохраняет ссылку на старый объект при создании нового, он будет доступен для сборки мусора, даже если старый объект используется в процессе создания новый.
Например:
class Foo {
private String name;
Foo() {
this.name = null;
}
Foo(Foo f) {
this.name = f.name;
}
public void setName(String n) {
this.name = n;
}
public Foo spawn() {
return new Foo(this);
}
}
Это не будет сохранять ссылки на старый Foo
при создании нового Foo
, поэтому старый Foo
может быть GC'd:
Foo f;
f = new Foo(); // The first Foo
f.setName("Bar");
while (/* some condition */) {
// Periodically create new ones
f = f.spawn();
}
Тогда как Foo
выглядело бы так:
class Foo {
private Foo parent;
Foo() {
this.parent = null;
}
Foo(Foo f) {
this.parent = f;
}
public Foo spawn() {
return new Foo(this);
}
}
... тогда каждый вновь появившийся Foo
будет иметь ссылку на предыдущие Foo
, и ни один из них не будет доступен для GC.