2014-09-24 3 views
2

Я выполнил следующий фрагмент, который вывел 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 привязан к экземпляру, который был аннулирован.

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

+1

Если Java GC похож на .NET GC: установка его на «null» не будет иметь значения для GC из-за таблицы времени жизни объекта. И 'System.gc()' не гарантирует выполнение GC. Все, что вы здесь делаете, указывает переменную на «null», но это не «удаляет» сам объект, потому что вы не касаетесь 'a'. –

ответ

6

Экземпляр никогда не был аннулирован. Это не концепция, которая существует в Java. То, что сбрасывается, является переменной, ссылкой. Экземпляр A, тем не менее, по-прежнему имеет действительную ссылку на свой экземпляр-экземпляр и поэтому может использовать его.

+0

Думаю, я понимаю: я просто потерял ссылку на 'test', но объект все еще существует и не считается сборщиком мусора (если это правильный термин), так как у меня все еще есть действительная ссылка на охватывающий экземпляр. Это оно ? – Dici

+0

@ Dici Это правильно. У вас есть доступная ссылка на него от 'a'. –

+2

Ну, на самом деле это был глупый вопрос, спасибо в любом случае! Я приму этот ответ после 8-минутной задержки. – Dici

Смежные вопросы