Gente tenho estudado para a certificação SCJP 5.0 e fiquei com uma grande dúvida em uma questão.
A questão é do capítulo 3 (página 152) do livro da kathy.
class CardBoard{
Short story = 5;
CardBoard go(CardBoard cb){
cb = null;
return cb
}
public static void main(String[] args){
CardBoard c1 = new CardBoard();
CardBoard c2 = new CardBoard();
CardBoard c3 = c1.go(c2);
c1 = null;
//FAZ ALGO
}}
Quando a execução chegar a //FAZ ALGO, quantos objetos estarão qualificados para a coleta de lixo?
RESPOSTA: 2
A resposta dada pelo livro foi que somente o objeto c1 está apto e como ele possui um objeto Short dentro dele este também estaria apto para a coleta.
Fiquei na dúvida pelo fato de eu ter lido que quando um objeto é passado como argumento para um método é utilziado a mesma referencia do objeto passdo, entao pensei, se o método c1.go passa um objeto e c2 e dentro do método o objeto é anulado achei q assim o objeto c2 também estaria nulo.
Além disso pensei q como o método go utiliza return cb e o objeto cb está nulo o c3 também estaria nulo.
Gostaria de saber o porque de somente o c1 estar nulo.
Alguém poderia me dar uma ajuda?
[RESPOSTA====]
No momento em que o método c1.go é chamado passando a referência a c2 isso faz com que go tenha controle para alterar o objeto c2 mas de acordo com a regra geral o método chamado não pode fazer com que a referência passada aponte para um novo objeto e nem nulo, ou seja, no momento em que a linha cb = null; é executada isso faz com que cb seja uma cópia totalmente desvinculada do objeto real. Caso fosse alterado somente um objeto de c2 sem anula-lo isso se refleteria no objeto c2 original.
Ficou meio embolado mas qualquer coisa perguntem q tento explicar melhor.