A presença de coleta automática de lixo torna o conceito de destrutores um pouco diferente de seus equivalentes em outras linguagens orientadas a objetos. Em Java destrutores são métodos chamados pelo sistema quando a memória de um objeto está para ser liberada pelo coletor automático de lixo (não quando está para ser coletada).
A sintaxe dos destrutores é a seguinte:
protected void finalize() {
//codigo para arrumar a casa, antes que o objeto seja apagado
}
Note que o que caracteriza o construtor é ter o mesmo nome da classe, já o destrutor é caracterizado por possuir o nome finalize. Você pode chamar o destrutor, mas isso não implica que o objeto será deletado. Ao contrário dos construtores, os destrutores não tem argumentos, mas possuem valor de retorno que é igual a void.
Os destrutores são muito úteis para “limpar a casa” quando um objeto deixa de ser usado. Um exemplo bastante comum do uso de destrutores é o de um objeto que lida com arquivos que devem ser fechados quando o objeto for destruído. Existem outros casos onde um objeto deve comunicar aos outros objetos que será inutilizado, destruído, ou seja : sairá do programa.
Em Java, que possui coleta automática de lixo, um objeto passa a não existir mais no programa quando nenhuma variável faz referência a ele. Nesse ponto, ele é armazenado no coletor automático de lixo, onde receberá o tratamento adequado. Um nó de uma lista ligada pode ser apagado simplesmente fazendo o nó anterior apontar para o posterior a ele. Os programadores não acostumados com esse conceito precisam ouvir a seguinte frase: “Você não é obrigado a liberar explicitamente a memória de um objeto como é feito em C++ e outras linguagens”.
Se estivéssemos por exemplo em C++, que não possui coleta automática de lixo, o destrutor seria chamado sempre que a memória de um objeto fosse desalocada, o que é feito pelo programador através de uma chamada a delete nomedoobjeto(); .
Em Java a liberação de memória que é feita pelo coletor automático de lixo que é executado de modo assíncrono com o restante do programa, ou seja você não pode contar com o fato de que o destrutor será chamado imediatamente após o momento em que seu objeto sai de escopo, a não ser que o programa seja executado com o modo assíncrono do coletor automático de lixo desligado (java -noasyncgc NomePrograma). Na versão beta, você não pode nem mesmo contar com a chamada do destrutor pelo garbage collector, de modo que ele deve ser usado apenas para otimizações do código.