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…