Olá pessoal, estou em dúvida em um determinado conceito na seguinte questão:
Dado:
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?
A. 0
B. 1
C. 2
D. A compilação falha
E. Não é possível saber
F. É lançada uma exceção no tempo de execução
A resposta do livro é C, mas para mim era B pelo seguinte motivo. c1 e c2 criaram dois objetos CardBoard e também dois objetos Short. De acordo com o livro, para objetos Byte, Boolean, Short e Integer (esses para valores abaixo de 127), é true quando comparados com == se esses objetos armazenarem o mesmo valor(claro que esses dois objetos têm que ser do mesmo tipo). Bom, a explicação da resposta ser C é porque c1 deixa de referenciar seu CardBoard e tanto esse quanto o objeto o qual a variável de instância story referencia podem ser coletados pela JVM. Mas a variável c2 também cria um objeto cujo valor é 5. Portanto, de acordo com o que diz o livro, a variável de instância c2 não deveria referenciar o mesmo objeto que a variável de instância story de c1, e portanto esse objeto Short não seria coletado pela JVM?
edit: Comi algumas palavras e havia esquecido de revisar…
c1 e c2 são 2 objetos distintos e c3 ja recebe uma referência nula…
acho que o exercicio parte do suposto que depois do comentário “faz algo” vc ainda teria que utilizar os objetos c1 e c2
e ae vmsb11? Então, eu até entendi isso. Mas eu fiquei na dúvida porque c2 também tem um variável do tipo Short cujo valor é 5, ou seja, o mesmo valor que a variável story de c1 armazena. E de acordo com o livro, para economizar memória, ambos deveriam referenciar o mesmo objeto. E como c2 não perdeu a referência para o seu objeto, imaginei que o Short que armazena o 5 não deveria ser coletado.
Bom, vamos ver, pode ser que eu esteja interpretando de maneira errada o que diz o livro… vou copiar o trecho:
"Para economizar memória, duas instâncias dos seguintes objetos wrapper serão sempre == quando os seus valores primitivos forem o mesmo:
. Boolean
. Byte
. Character de \u0000 até \u007f(7f é 127 em decimal).
. Short e Integer de -128 até 127 "
Será então que sempre os objetos terão instâncias diferentes mas o operador == devolve true quando objetos de valores iguais são comparados? Mas onde estaria a economia de memória neste caso?
Que confusão. O Short não tem nada a ver com a historia.
Ele é referenciado pelo objeto onde está, portanto nunca é elegivel na linha em causa. (ele será elegivel depois que os objetos que o referenciam seja recolhidos ou anulados).
Objetos elegíveis são aqueles que existem no fim do método e não são atributos de outros objetos. (porque o CC não corre durante o método , apenas antes ou depois).
A pergunta é o mesmo que perguntar : Quantos objetos foram criados que não são referenciados por ninguem quando o método termina. (Short, obviamente não está nesta categoria)
Fala Sergio, tudo bem? Então, há uma relação com o Short sim. A resposta correta é 2 justamente porque o objeto Short entra em uma “ilha de isolamento”. Ele continua sendo referenciado por uma variável dentro do objeto CardBoard, mas esse já não é mais referenciado por uma variável de referência na pilha. Agora, se o livro não estivesse errado, e o código fosse o mostrado acima (com Short recebendo 5), o objeto Short seria referenciado por duas variáveis de instância (duas variáveis story). Uma delas seria perdida (porque c1 recebeu o valor null), mas uma delas se manteria (a que corresponde ao objeto CardBoard referenciado por c2), e a resposta seria 1.