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
}
}
Questao do livro Kathy Sierra scjp 5- dúvida pag 152
16 Respostas
2 objetos
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.
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.
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
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.
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.
.
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));
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,
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.
Realmente!! desculpe, não tinha visto!! mais ai serão quatro objetos apto??
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.
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…
Hum!! show de bola… massa
vlw parceiro!!
.
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.