Garbage Collector

Segue a seguinte questão:

class MyClass{
  private MyClass z;
  public void other(MyClass c){
    z = c;
  }
  protected void finalize(){
      System.out.println("called");
  }
  class Test{
      private static void f(){
      }
      public static void main(String args){
          MyClass c1 = new MyClass();
          MyClass c2 = new MyClass();
          c1.other(c2);
          c2.other(c1);
          MyClass c3 = new MyClass();
          c1=c3;
          c2=c3;
          f();
      }
}

Pergunta: Após a ececução do metodo f() quando objetos estarão disponíveis pelo Garbage Collector?
Resp: 2

[b]
Minha respota e dúvida:

c1 —> MyClass
c2 —> MyClass.[/b]

C1 e C2 referencial MyClass diferentes.
No momento em que o metodo publico other é invocado a referencia de Z passa a “apontar” a mesma referencia de C1, e depois a referencia de Z passa a “apontar” a referencia de C2 com a segunda chamada de método.
Então na minha resposta passamos a ter já 2 objetos q eram apontados por Z para ser possivelmente coletado pelo Garbage Collector.
c1.other(c2).
c2.other(c1).

1ª Z ----> C2
2ª Z -X–>C2
agora fica Z —>C1. Uma nova referencia para Z que antes referenciava C2 agora referencia C1.

Com tudo após a segunda chamada de método é criado uma nova intancia C3 de Myclass e C1 e C2 que passam a referenciar C3, ou seja, não temos um terceiro Objeto pronto para ser coletado pelo Garbage Collector que era a referencia de Z—>C1?

Espero que tenha ficado claro para todos a explicação.
Sem mais…

Eu acho que acabei entendendo, mas vou ficar aguardando respostas mais experientes para ver se tenho razão.

=]

[quote=anderson.bonavides]
Então na minha resposta passamos a ter já 2 objetos q eram apontados por Z para ser possivelmente coletado pelo Garbage Collector.[/quote]
Não. Os objetos ainda são referenciados pelas variáveis c1 e c2, logo não podem ser coletados.

[quote=anderson.bonavides]
Com tudo após a segunda chamada de método é criado uma nova intancia C3 de Myclass e C1 e C2 que passam a referenciar C3, ou seja, não temos um terceiro Objeto pronto para ser coletado pelo Garbage Collector que era a referencia de Z—>C1?[/quote]
O 3º objeto não pode ser coletado pois existem 3 variáveis referenciando ele: c1, c2 e c3.

Lembre-se que a variável não é um objeto, ela só referencia ele. Enquanto houver uma variável referenciando um objeto, ele não pode ser coletado (a não ser que seja uma ilha de isolamento, como é o caso dos 2 primeiros objetos depois que c1 e c2 param de referenciá-los).

Muito bom, mas ainda vou dar uma outra olhada para ver se clareira mais as idéias.

=]