SCJP - exercicio livro da katy

12 respostas
Humbertim2

ola pessoal...

no capitulo tres do livro da katy há o seguinte exercicio...
public class CardBoard {
	
	Short story = 5;
	
	CardBoard go(CardBoard x){
		
		x = null;
		return x;
	}
	
	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 respostas/explicação dada pelo livro diz q a resposta correta é a C, e explica que apenas um objeto do tipo CardBoard está qualificado para a coleta e que o wrapper Short tbm esta qualificado, já q nenhuma thead pode alcança-lo.

eu discordo dessa resposta pois a referência c3 tbm (pelo q entendo) está qualificado para a coleta, já que recebera o valor null nesta execução.
então a resposta seria 3 objetos qualificados para a coleta.

estou certo??

obrigado pela atenção

12 Respostas

M

Preste bastante atenção nesse tipo de questão. A referência c3 não “aponta” para nenhum objeto criado no heap. Não foi criado um objeto c3. Isso é que confunde…

Humbertim2

ishi… doidera…
mais o objeto c1 ao ser atribuido null deixa de ter a referencia ao objeto CardBoard… ou seja ele nao aponta pra nenhum objeto criado no heap…
nao eh??..
e baseado nisso q vc falou… a referencia c3 nao estaria qualificado para coleta de lixo??..

M

Como c3 seria qualificado para a coleta de lixo se não foi criado um objeto c3? Entendeu?

Humbertim2

=]… okay… okay… valews pela ajuda

dlt

Eu não entendi o seguinte: quando ele passa a cópia da referência do objeto c2 no método em c1.go(c2), ele seta a referncia de c2 pra null, também, certo?
Logo, seriam 3 objetos elegíveis. Ou não?

bl.rafael

Pelo que entendi, o objeto c3 não é instanciado (new), e o objeto c2 que foi passado recebeu null, logo está qualificado para o gc e o wraper Short que existia dentro dele.
A dúvida do nosso amigo é que c3 não foi instanciado, logo não está qualificado para o gc.

O que vale lembrar é, se o c3 fosse instanciado, e depois declarado null, não seriam 3 objetos qualificados para o gc, e sim 4, pois cada objeto possui uma referência Short dentro dele. Correto?

dlt

Nesse caso ficou faltando o objeto c1.
Seriam 3 elegíveis. c1, c2 e o wrapper short.

Humbertim2

bl.rafael:
Pelo que entendi, o objeto c3 não é instanciado (new), e o objeto c2 que foi passado recebeu null, logo está qualificado para o gc e o wraper Short que existia dentro dele.

[b]A dúvida do nosso amigo é que c3 não foi instanciado, logo não está qualificado para o gc.

O que vale lembrar é, se o c3 fosse instanciado, e depois declarado null, não seriam 3 objetos qualificados para o gc, e sim 4, pois cada objeto possui uma referência Short dentro dele. Correto?[/b]

ótima observação…

alerodrigues

acredito que:

no método c1.go(c2) é passada uma cópia da referência para o objeto c2, não objeto em sí.

por isso o null dentro do método é atribuído a essa cópia da referência apenas, portanto o objeto c2 continua válido.

e o objeto c3 nem é instanciado na memória como já disseram.

certo ?

paulo.ubuntu

Se voce prestar atenção apenas c1 perdeu completamente a sua referencia…e como um Objeto do tipo CardBoard
tem um Short…
quando chegar na ultima linda c1 ficou elegivel e com sigo sua variavel de instancia tambem

então a resposta é

2

paulo.ubuntu

Se voce prestar atenção apenas c1 perdeu completamente a sua referencia…e como um Objeto do tipo CardBoard
tem um Short…
quando chegar na ultima linda c1 ficou elegivel e com sigo sua variavel de instancia tambem

então a resposta é

2

paulo.ubuntu

Ixiiiii

duplicouuu :shock: :shock: :shock: :shock:

Criado 3 de maio de 2008
Ultima resposta 12 de mai. de 2008
Respostas 12
Participantes 6