Questao do livro Kathy Sierra scjp 5- dúvida pag 152

16 respostas
serjava
Pro pessoal que tem o livro SCJP 5 da autora acima. Na pg 152, o exercício 2, classe CardBoard. O livro afirma que a resposta certa é 2, porque seria apenas a cópia c1 e sua classe Wrapper. A dúvida que me fez abrir esse tópico é se c3 também estaria qualificado pra coleta, pois c3 recebe null... -------------------------------------------------------
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
 }
}
A pergunta era : quando chegar em // faz algo, quantos objetos estarão qualificados para coleta de lixo. O livro diz que são 2, Alguém mais acha que são mais objetos, devido a c3 receber um null do método go ???

16 Respostas

rogelgarcia

2 objetos

serjava

Dizer apenas 2 objetos sem EXPLICAR o porque não vale, pois O LIVRO já diz que a resposta é 2 isso eu já sabia.
Um fórum é para AMPLIAR a discussão, portanto SOMENTE se SOUBER EXPLICAR porque, responda.

G

Quantos objetos você acha que estão qualificados?
Talvez esteja confundindo a referencia ao objeto com o objeto em si, por exemplo:

CardBoard c2 = new CardBoard();
c1.go(c2); // <= Nessa chamada ao método “go( CardBoard cb)” iguala a variável “cb” a null, porém ainda existe uma referencia a esse objeto (c2 = new CardBoard() ), na linha acima.

Eu também tive algum trabalho para entender esse processo, acredito que também seja sua dúvida.

Blz?
Espero ter ajudado.

Abs.
Paulo Gervasio.

A

Olá,

estou estudando para a SCJP 6 c/ o livro da Kathy tb…

acho q a resposta de 2 tá correta pois está sendo criado 2 objetos através da instância…

AS

Dirceu_Roden

andredecotia:
Olá,
acho q a resposta de 2 tá correta pois está sendo criado 2 objetos através da instância…

Na verdade estão sendo criados 4 objetos:
Dois objetos CardBoard e dois objetos Short.

CardBoard c1 = new CardBoard(); --> cria um objeto CardBoard e um Short
CardBoard c2 = new CardBoard(); --> cria um objeto CardBoard e um Short

CardBoard c3 = c1.go(c2); --> Note que o método go() retorna null, mas não tira a referencia de c2 a um objeto CardBoard que por sua vez tem uma referencia a um aobjeto Short.

c1 = null; --> Após esta linha UM objeto CardBoard e UM objeto Short estarão disponíveis para a coleta de lixo.

serjava

Andre, o Dirceu está correto. A cada CardBoard, são 2 objetos criados de uma vez, portanto 4 objetos em 2 instâncias de Cardboard.
Somente c1 recebe null, portanto liberando 2 objetos.

Depois de pensar em tudo isso por algum tempo, cheguei a uma explicação de porque a resposta são 2 objetos.

A explicação mais plausível é porque c3 NUNCA FOI um objeto no heap, ou seja, foi inicializada com NULL, portanto nunca houve um objeto para ser coletado.
Diferente de c1, que FOI UM OBJETO CardBoard no heap, e DEPOIS foi atribuido a null, fazendo com que o objeto criado no heap ficasse “SOLTO” portanto qualificado para a coleta.

Então, concluo o seguinte:
Não basta apenas uma variável receber null para estar qualificada para coleta. Se ela acabou de ser INICIALIZADA com null, não existe NADA pra ser coletado.
Mas se a variável que recebeu um null estava referenciando um Objeto no heap (como c1), nesse caso o objeto fica sem uma variável vinculada, por isso é qualificado para a coleta.

Dúvida sanada, obrigado a todos.

Dirceu_Roden

.

serjava

Outro ponto interessante na questão é que c2, que é passada ao método go, NÃO É ANULADA dentro do método, pois a referência passada é uma CÓPIA da referência original. Ou seja, apesar do argumento cb (cópia de c2) receber null, c2 NÃO recebe null no final das contas. Fácil de verificar, basta adicionar um debug no programa, abaixo da linha:

CardBoard c3 = c1.go(c2);
System.out.println("Checking if c2 is null: " + (c2==null));

leidson-JAVA

Na realidade, desde o começo, só existem 2 Objetos pois um objeto só é criado quando você usa “new”!!!

assim:

CardBoard c1 = new CardBoard();
CardBoard c2 = new CardBoard();

Ai estão os dois objetos criados!! c1, c2 e c3 são apenas variáveis de referência pois estão referenciando os objetos criados!

c2 e c3 estão referenciado o mesmo objeto, no momento q c2 é passado como parâmetro e recebe null o objeto ainda não está qualificado para a coleta de lixo, pois c3 ainda referencia ele, porém quando c3 recebe null, nenhuma variavel está referenciando esse objeto que ai acaba ficando apto para a coleta de lixo. Em fim depois c1 recebe null deixando o outro objeto apto para a coleta pois nenhuma outra variavel referencial ele!!

OBS.: Grave isso, um objeto só é criado quando você usa “new”!! e ele só está apto para a coleta, quando nenhuma variável refenciar ele!!!

Abraço,

Dirceu_Roden

leidson-JAVA:
Na realidade, desde o começo, só existem 2 Objetos pois um objeto só é criado quando você usa “new”!!!

OBS.: Grave isso, um objeto só é criado quando você usa “new”!! e ele só está apto para a coleta, quando nenhuma variável refenciar ele!!!

Mas quando você atribui um valor literal à uma variável wrapper também está criando um objeto:
Short story=5; --> Um objeto Short é criado, mesmo sem usar explicitamente a palavra chave new.

Assim,
CardBoard c1 = new CardBoard();
vai criar dois ojetos na memória. Uma instância de CardBoard e uma instância de Short.

Então não são criados apenas dois objetos, mas QUATRO. DOIS CardBoard e DOIS Short.

leidson-JAVA

Realmente!! desculpe, não tinha visto!! mais ai serão quatro objetos apto??

Dirceu_Roden

Não, apenas dois.
Olhe bem para o método go()
A variável cb é configurada para null, mas a variável c2 não.
c2 continua apontando para um objeto CardBoard.

Então apenas o CardBoard de c1 e o seu respectivo objeto Short estarão aptos para a coleta (Dois objetos).

c2 continuará referenciando um objeto CardBoar que por sua vez tem uma referencia a um objeto Short. Estes dois ojetos NÃO o estarão aptos para a coleta.

rogelgarcia

serjava:
Dizer apenas 2 objetos sem EXPLICAR o porque não vale, pois O LIVRO já diz que a resposta é 2 isso eu já sabia.
Um fórum é para AMPLIAR a discussão, portanto SOMENTE se SOUBER EXPLICAR porque, responda.

Ichi… tá igual ao cara do static…

http://www.guj.com.br/posts/list/201867.java

leidson-JAVA

Hum!! show de bola… massa

vlw parceiro!!

serjava

.

taaqui

Sei que a conversa é meio antiga mais eu tenho algo a somar, quando ele passa c2 para o método go(), ele passa por cópia e não o objeto em si, então o que esta sendo manipulado em go() não é o objeto c2. além disso c3 nunca foi um objeto, apenas uma referencia a um objeto que nunca existiu já que no retorno da referencia c1 ele retorna null, então nada fica disponível para o GC até a linha 14, quando o c1 recebe null e o objeto que foi criado por ele se perde da referencia e fica disponivel para o GC junto com o Wrapper Short criado.

2 objetos.

Criado 2 de maio de 2010
Ultima resposta 10 de mai. de 2010
Respostas 16
Participantes 7