Construtores e Destrutores

9 respostas
J

Gostaria de saber se existe em java construtores e destrutores, como em C/C++…

falow

9 Respostas

R

construtor sim, o construtor assim como no C++ possui o mesmo nome da classe e é chamadado toda vez que a classe é instanciada;;

class Pessoa
{
     Pessoa()
     {
         // isto é um construtor
     }
}

destrutor, hummm, mais ou menos :slight_smile:

existe um método finalize() da classe Object cujo é chamado toda vez que uma classe é coletada pelo Garbage Collector. No C++ vc usava um free ou delete para desalocar a memória mas no java como já deve saber existe o Garbage Collector que faz este trabalho. Então quando ele entra em ação ele “teoricamente chamaria o método finalize(), mas isto não é garantido pela especificação da linguagem”…

a assinatura do finalize é: protected void finalize() throws Throwable…

uma técnica usada para deixar um objeto elegível para o garbage collector é atribuir a sua referência ao valor “null”, assim:
Object o = new Object(); // chama o construtor
o = null; // deixa este objeto pronto para ser coletado, mas isto não é garantido :slight_smile:

vc pode provocar que o Garbage Collector rode manualmente assim:
System.gc(); Faça isso e veja como o finalize() funciona :slight_smile:

B

Só um [size=“9”]pequeno detalhezinho[/size] em relação ao finalize (útil apenas pra quem vai fazer prova de certificação ou algo do tipo):

A especificação garante sim que o método finalize será chamado na primeira vez que o garbage collector tentar remover o objeto. O que não é garantido pela especificação é que o garbage collector vá tentar remover o objeto, e por esse motivo o método finalize talvez nunca seja chamado.

R

bem observado :slight_smile:

D

A chamada ao System.gc(); não garante que o Garbage Collector seja exacutado naquela momento, digo, não garante que os objetos eleitos ao GC sejam desalocados.

J

Aê galera…valew…

Agora estou esclarecido…

Falow

D

Muito interessante, o java não deixa acumular lixo na memória, ele possui um método automático para liberar a memória, coleta automática de lixo, ou seja eles finalizam o método liberando a memória, mas se quiser pode-se excluir você mesmo através do código. E é protegido, bom para evitar erros, interferências de algum outro código.
Prefiro fazer a finalização, o sistema não faz mágica, porque pode-se esquecer algum código e não ser liberado corretamente.

T

O recomendado, no entanto, é:

  • Ter um método “close” ou coisa parecida, para liberar os recursos que porventura tenham de ser devolvidos explicitamente (como é o caso de arquivos, que têm de ser fechados);
  • Evitar ter o tal método “finalize”, porque ele atrapalha o “garbage collection”.
D

Fiquei pergutando para mim, e se a coleta automática não funcionar? O SO vai cair em um starvation e não vai conseguir liberar a memória, e ai? Eles tem de bolar um processo manual eficiente se o automático não funcionar, ou seja, liberar na marra.

B

Se não funcionar, então tem algo de errado no programa que está rodando na JVM.

O SO não fica sem memória por que ele libera uma quantidade máxima fixa para a JVM. Se a JVM chegar ao limite, problema é somente dela, que se resolva com a coleta de lixo, ou morra tentando com um OutOfMemoryError.

Criado 27 de setembro de 2003
Ultima resposta 18 de ago. de 2008
Respostas 9
Participantes 7