Я выполнил следующий фрагмент, который вывел Hey David
.Поведение приложенного типа, когда экземпляр экземпляра недействителен
public class Test {
public String name;
public Test(String name) {
this.name = name;
}
public class A {
public String toString() {
return "Hey " + name;
}
}
public static void main(String[] args) {
Test test = new Test("David");
A a = test.new A();
test = null;
System.out.println(a);
}
}
Я также протестировали вызвать System.gc()
перед печатью a
, но я не уверен, что на самом деле вызывает немедленно полный GC поэтому он не может быть уместным. Честно говоря, перед запуском кода я понятия не имел, что это должно произойти, потому что фактическое поведение кажется мне логичным, как если бы NPE был брошен, так как name
привязан к экземпляру, который был аннулирован.
Не могли бы вы объяснить мне, почему мы наблюдаем это и как именно работают экземпляры закрывающего типа?
Если Java GC похож на .NET GC: установка его на «null» не будет иметь значения для GC из-за таблицы времени жизни объекта. И 'System.gc()' не гарантирует выполнение GC. Все, что вы здесь делаете, указывает переменную на «null», но это не «удаляет» сам объект, потому что вы не касаетесь 'a'. –