Qualificação de Objetos

15 respostas
H

Fique com dúvida nesta questão referente a quantos objetos estão qualificados para o coletor de lixo.

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. É lnçada uma exceção no tempo de execução.

A resposta é C, c1 e o Waraper Short.

Fiquei com dúvida aqui, c1 realmente esta qualificado junto com o Short, e c2 não será porque apesar de ter sido passado para o método e ter sido referenciado para null no método não o altera, mas porque c3 não está? visto que c3 recebe o valor de retorno do método c1.go(c2) que é um null.

Agradeço aos amigos que poderem solucionar a dúvida.

Abraços.

15 Respostas

marcosbrandao

Higor antes de postar, faça uma busca.
Já existe uma thread que trata deste assunto:

http://www.guj.com.br/posts/list/77248.java#408089

anderson.bonavides

É preciso frizar alguns pontos importantes nessa questão. A variável de classe story está ali só para ocupar espaço. Então o que precisamos verificar?

Precisamos saber do seguinte conceto:
1º) Um objeto está qualificado para o Garbage Colector quando não puder ser mais tocado. Isso tem que ser verificado com bastante atenção pois se um objeto for referenciado com null ele ainda poderá ser tocado caso haja mais alguma variavel que aponte para ele. É o caso de:

A() a = new A(); A a2; a2 = a; a = null;

Apesar de ser referenciado como null o objeto ainda poderá ser tocado por a2;

2º) C3 neste caso não foi instanciado por tanto não aponta para ninguêm não é a variavel em si que vai ser coletada e sim o objeto a qua ela aponta. No exemplo acima poderiamos demonstrar da seguinte forma:
Ambos apontam pro mesmo objeto:
a -----> [A] <------a2
Mas se eu referenciar a como null o objeto ainda vai ser tocado por a2
a --X–> [A] <-----a2

F

Aproveitando anderson.bonavides da otima explicação,sempre fiquei com uma dúvida se eu fizer tiver então
um variável qualquer do tipo Animal a=null;do jeito que esta ,será qualificada para coleta não ?Ela nao criou nenhum objeto
veleu!

anderson.bonavides

fabioEM:
Aproveitando anderson.bonavides da otima explicação,sempre fiquei com uma dúvida se eu fizer tiver então
um variável qualquer do tipo Animal a=null;do jeito que esta ,será qualificada para coleta não ?Ela nao criou nenhum objeto
veleu!

Vc criou uma variável do tipo Animal. Mas vc não criou um objeto tipo Animal. Animal a não se refere a ninguêm. Apartir do momento que vc intancia a variavel Animal a = new Animal(); vc está dizendo que a passa a referenciar um objeto tipo Animal.

H

Agradeço pelas respostas anderson e fabioEM, eliminaram totalmente minhas dúvidas.

Abraços.

scarton

Mas neste caso a resposta não seria B (1 objeto), uma vez q Short é membro e não objeto?

anderson.bonavides

Um objeto seria C1 já que ele referênciava CardBoard e o outro objeto seria CardBoard cb no método ja que ele primeiro vai apontar para o mesmo objeto C2 e depois vai perder a referência.

Segue uma vizualização do cenário. Era assim que estudava no papel.

scarton

Agora sim esta claro, mas é um pouco dificil enxergar td isso na hr do exame não?rsss

obs: gostei da ideia do desenho, aplicarei nos meus estudos!

Abraços,

anderson.bonavides

scarton:
Agora sim esta claro, mas é um pouco dificil enxergar td isso na hr do exame não?rsss

obs: gostei da ideia do desenho, aplicarei nos meus estudos!

Abraços,

Depois que vc começa a desanhar vc consegue vizualizar rapido. E não tem jeito na hora da prova o papel vai aparecer em cena varias vezes. Pra desenhar pra responder multipla escolha.

=]

J

Pelo que vc disse um objeto referencia outro, é isso? Cuidado! Essa confusão entre variáveis de referências e objetos podem comprometer na resolução de questões. Se bem que vc já passou na prova né :slight_smile: Mas fica o alerta pra galera que ainda está na luta. A propósito, só há 1 objeto qualificado para coleta. Dêem uma olhada nesse post http://www.guj.com.br/posts/list/81738.java

anderson.bonavides

É verdade dev eu tava olhando isso agora pouco mas ainda não postei por causa de tempo. Neste instante eu ia fazer esta alteração. E pedir desculpa ao erro que está ai. Não tem nenhum obj no método para ser coletado.

H

Portanto a resposta do livro está incorreta já que a resposta é C, dois objetos estão qualificados para a coleta de lixo.

anderson.bonavides
Higor:
Portanto a resposta do livro está incorreta já que a resposta é C, dois objetos estão qualificados para a coleta de lixo.

Sim é verdade higor. Vou te mostar um exemplo onde dois objetos estariam qualificados mostrando o mesmo exemplo.

class CardBoard {
     Short story = 5;
     CardBoard go(CardBoard cb) {
          cb = new CardBoard();
          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
     }
}

Agora tenho 2 objetos. Um no método CardBoard e um do método main.

Espero ter me redimido aki do erro. =]

marlon_patrick

galera…a reposta do Livro está correta…
é a letra C…
2 objetos estão qualificados para a coleta…
isso acontece pq o objeto para que c1 aponta é perdido e não tem mais ninguem o referenciando…
e esse objeto para que c1 apontava tem um objeto Short…que tambem não tem mais nenhuma referencia
portanto os 2 estão qualificados.

Ai vai uma dica…
subscreva o metodo finalize da classe, pois quando o coletor é executado ele chama o método finalize do objeto sendo coletado…

ublic class A {
	B b = new B(); 
	
	@Override
	protected void finalize() throws Throwable {
		super.finalize();
		System.out.println("finalizou A");
	}
	
	public static void main(String[] args) {
		A a = new A();
		a=null;
		System.gc();
	}
	
}
class B{
	@Override
	protected void finalize() throws Throwable {
		super.finalize();
		System.out.println("finalizou B");
	}
}

A saída desse codigo é:
finalizou B
finalizou A

portanto…foram coletados 2 objetos.

H
Quem disse um realmente estavas certo, isso é dito na errata do livro, veja o endereço de erratas <a href="http://saloon.javaranch.com/cgi-bin/ubb/ultimatebb.cgi?ubb=get_topic&f=24&t=034230">http://saloon.javaranch.com/cgi-bin/ubb/ultimatebb.cgi?ubb=get_topic&f=24&t=034230</a> o certo era ser um número maior ou igual a 128 em

Short story = 5;

porque dessa forma que estas a JVM não cria um novo objeto no heap, alias apenas para os intervalos de -128 a +127 ela não criará no heap o objeto.

Portanto na errata eles dizem para colocar:

Short story = 200;

Assim a resposta correta é a do livro.

Abraços

Criado 14 de fevereiro de 2008
Ultima resposta 27 de fev. de 2008
Respostas 15
Participantes 7