método destrutor

tem como eu definir um método destrutor da minha classe, que será chamado automaticamente quando o garbage collector um objeto dessa classe?

Sim, tem o método finalize(), que é chamado pelo garbage collector antes da coleta. Mas seu uso não é recomendado, por haver uma série de pequenos detalhes que você deve se atentar ao usá-lo, mas que não me lembro agora… E, na maioria dos casos, ele não é necessário. É provável que não precise dele, mas aí é você que vai me dizer: o quê quer fazer?

objeto = null;

e deixo o resto com o garbage collector

realmente, nao sei se é mesmo necessario oq eu mencionei, mas eu queria criar uma classe de conexao a banco de dados, e colocar um metodo que feche a conexao automaticamente quando o gc coletar o meu objeto.
de qq forma, mesmo q n seja necessario nesse caso, eu queria saber como faz, pq em algum momento isso pode ser necessario pra mim

Creio que seja melhor sua classe Conexao ter um método fechar(). E seu objeto não for mais necessário, é melhor você dar um fechar() antes. De qualquer forma, se você quiser usar, sobreescreva o método protected void finalize(), definido na classe Object. Só tem uns detalhes:

  • ele só vai ser chamado uma vez pelo gc;

  • como finalize() é um método qualquer, se você passar this como parâmetro para um outro método qualquer, você pode acabar salvando o objeto da deleção. Neste caso, se ele tornar elegível para deleção novamente, o finalize() não rodará novamente;

  • como você não garante quando e se o gc irá rodar, você não pode garantir que o finalize() irá rodar na sua aplicação.

Se você realmente quiser usá-lo, crie um método fechar() para sua classe e o chame de dentro do finalize():

public void fechar() {
    // fechar a conexão
}

protected void finalize() {
    fechar();    // você está tentando garantir que, se o objeto for passível 
                 // de deleção, a conexão será fechada. Mas isso é não é
                 // 100% certo...
}

Não é garantido, então o uso de finalize() não é recomendado. Mas se quiser mesmo, taí…

Até mais,

o finalize eh util para debugar o programa… se vc quer saber o q ta acontecendo com o objeto, sobreescreve o metodo finalize e ve se ele ta sendo deletado…

ateh hj eu soh usei pra debugar mesmo… mas acho q ele pode ser util… nunca se sabe…

e pode-se forcar o metodo a ser coletado chamando System.gc()…

Tecnicamente, não se força o garbage collector a rodar… o System.gc() é mais uma sugestão à JVM de que é interessante rodar o gc agora. Mas a decisão final é da JVM.