2009-12-14 3 views
2

Вопрос из теста SCJP:Вопрос из теста SCJP

class A{ 
     A aob; 
     public static void main(String args[]){ 
      A a=new A(); 
      A b=new A(); 
      A c=new A(); 
      a.aob=b; 
      b.aob=a; 
      c.aob=a.aob; 
      A d=new A().aob=new A(); 
      c=b; 
      c.aob=null; 
      System.gc(); 
     } 
    } 

Вопрос: после того, как c.aob=null выполняется, сколько объектов имеют право для сбора мусора.

Я думаю, что 1, но правильный ответ 2. Что случилось?

+3

Что такое 1? Что такое 2? –

+0

@slead - вы найдете панель предварительного просмотра весьма полезной при редактировании и публикации вопросов! –

+0

Я обновил вопрос, чтобы на самом деле включить вопрос (найденный Гуглигом). –

ответ

5

От Googling Я нашел this thread.

Первый объект, на который первоначально ссылался c.

A a = новый A();
A b = новый A();
A c = новый A();
a.aob = b;
b.aob = a;
c.aob = a.aob;
A d = новый A(). Aob = новый A();
c = b; // (1)

Он имеет право на (1).

Другой объект, право на ГХ при постановке

Д о = новый А() .aob = новый А();

Здесь объект, созданный в тексте выделенного жирным шрифтом, будет иметь право на GC. Объект в курсивом будет присвоен d.

+0

Я согласен! В общем, объекты, которые имеют право на GC, являются теми, которые не могут быть достигнуты с помощью какой-либо ссылки. В более сложных сценариях они являются «островами», если объекты с перекрестными ссылками, на которые не ссылаются другие объекты за пределами этого «isle». –

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