Questão sobre Finalize()

Olá pessoal… tenho uma dúvida no seguinte código tirado do WhizLabs:

class FinalizeTest {
	
	int x;
	
	FinalizeTest(int i){
		x=i;
	}
	
	protected void finalize(){
		System.out.println(x);
	}
	public static void main(String[] args) {
		
		FinalizeTest ft1 = new FinalizeTest(10);
		ft1.finalize();
		
		FinalizeTest ft2 = new FinalizeTest(20);
		ft1 = null;
		ft2 = null;
		System.gc();

	}

}

Os possíveis resultados são: (escolha 2)

[a] Compila e executa sem erros; imprime 10
[b] Compila e executa sem erros; imprime 102010
[c] Não compila
[d] Compila e executa sem erros; imprime 2010
[e] Compila e executa sem erros; nao imprime nada
[f] Runtime Exception

Não entendi porque a resposta correta é A e B. A resposta A eu entendi pois não há garantias que o GC vai ser executado, mas se a resposta B estiver correta, entao finalize() vai ser chamado mais de uma vez no objeto ft1; isso que não entendi.

Alguém pode me explicar?

Pois primeiro ele chama o finalize diretamente, imprime 10, depois o GC é executado e 2010 é impresso. Caso você retire a linha ft1.finalize(); a resposta certa seria a D.

Não necessariamente. Mesmo atribuindo a null e chamando System.gc() você não tem garantia nenhuma que será executado o método finalize(que os objetos serão recohidos.

A resposta A realmente vai acontecer, pois está chamando o método finalize diretamente.
A resposta B é por causa da pergunta ‘possíveis resultados’, a B pode ocorrer pois o garbage collector pode aceitar a sugestão e realmente executar, mas a primeira impressão será 10 invariavelmente.

O rafael está correto.

mas finalize() não é chamado no máximo uma única vez em um objeto? Ele não estaria sendo chamado 2 vezes pelo objeto “ft1”?

ou eu posso chamar finalize() diretamente quantas vezes eu quiser em um mesmo objeto e mesmo assim o GC ainda vai chamar finalize() nesse objeto?

Estou com dúvida nesse ponto.

Realmente eu me expressei mal. Quanto ao finalize(), ele é chamado uma única vez antes do objeto ser ‘coletado’, caso o objeto seja recuperado com o finalize() e depois se torne apto para o GC, o metodo não sera chamado de novo. Isso não significa que você não possa chama - lo diretamente varias vezes.

Agora entendi… Vlw Pilon e pessoal.