[RESOLVIDO] SCJP 6 - Capítulo 3 Questão 1 - Objetos Elegíveis para o Garbage Collector

[code]class CardBoard {
Short story = 200;
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;
//do Stuff
}
}[/code]
Quando //doStuff é alcançado, quantos objetos estão elegiveis para o Garbage Collector?

O Livro diz que a resposta correta seria 2, apenas um CardBoard object (c1). mas ele possui um Short wrapper associado que também é elegivel.

Mas fiquei na duvida, pq o objeto c2 também não estaria elegivel? O livro está correto ou incorreto nessa afirmação?

Porque o c1 é definido como null na linha 12, entao ele e os objetos que ele cria, nem o c2 nem o c3 é definido como null por isso o gb nao coloca ambos na lista de espera.

Abraços

Está certo o livro… a única variável que perde a referencia é o c1… o c2 continua com o objeto configurado… e o c3 nunca teve um objeto para ele

um detalhe meio dificil de entender no começo é essa história de variavel passada por referencia…

quando você passa um objeto para um método, você está passando uma referência ao objeto, não o objeto em si, na verdade uma cópia da referencia passada existe no método chamado, mas não é a mesma “variavel” apesar de apontar para o mesmo objeto na memoria, ou seja:

quando você 11 do seu códigochama c1.go passando c2, c2 é uma referencia ao objeto na memoria, dentro do metodo go de c1, você tem “outra” referencia chamada cb, que aponta para o mesmo objeto que c1, mas não é a mesma referencia…

se você setou cb = null você destruiu a referencia, mas não o objeto na memoria… a outra referencia (c1) continua normal, apontando para o mesmo objeto na memoria, sendo assim tem uma referencia para este objeto e ele não fica elegivel…

intendeu?

editando… se bem me lembro nessa questão no livro preparatorio para a scjp 5, la dizia que o objeto story dentro de c1 nesse código fica elegivel ao gc sim… se ai ta que não fica elegivel provavelmente ta errado esse ponto…

Entendi, havia feito confusão com essa parte da referencia mesmo.
Quando chego no método go tenho duas referencias ao objeto referenciado pelo c2, ao executar cb = null, destruo uma dessas referencias, mas a c2 continua existindo…

Não sei se escrevi direito, mas entendi o conceito, valew pessoal :smiley: