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.
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.
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.