Excluindo um objeto em java?

99

Quero excluir um objeto que criei (um oval que segue você), mas como faria isso?

delete follower1;

não funcionou.

EDITAR:

Ok, vou dar mais contexto. Estou fazendo um pequeno jogo com um oval que você pode controlar e um oval que o segue. Agora eu tenho arquivos chamados: DrawPanel.class, esta classe desenha tudo na tela e lida com colisões, sons, etc. Eu tenho um inimigo.class, que é o oval após o jogador. Eu tenho um entity.class, que é o player que você pode controlar. E se o jogador se cruzar com o seguidor, quero que meu objeto jogador seja excluído. Do jeito que estou fazendo:

    public void checkCollisions(){
    if(player.getBounds().intersects(follower1.getBounds())){
        Follower1Alive = false;
        player.health = player.health - 10;
    }
}
Stan
fonte
1
você pode fornecer um pouco mais de contexto?
Joseph Weissman,
2
Não há exclusão de objetos em Java. Mas normalmente você não precisa: o que você precisa é ter certeza de que não há mais nada sendo mostrado na tela (se é isso que "te seguindo" está fazendo).
Paŭlo Ebermann,
Talvez você queira tentar forçar o coletor de lixo a remover um objeto? já há uma pergunta sobre isso aqui . Ou talvez você esteja tentando outra coisa? você pode tentar ler um pouco sobre o coletor de lixo aqui ou aqui. Se ainda não houver ajuda, você precisará ser mais específico.
Fawix de
possível duplicata de Forçar exclusão explícita de um objeto Java
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
Se você realmente realmente deseja manipular alocações de objetos manualmente, use JNI: crie uma lib C / C ++ que é usada a partir do código Java, mas faz tudo (criar, excluir, etc.) por conta própria - mas dentro de sua biblioteca você tem C / Código C ++, sem Java. Eu não vi nenhuma maneira de excluir um objeto Java manualmente. Se o seu criador de perfil informar que há problemas, esses problemas geralmente se baseiam em referências "esquecidas" a objetos. No seu caso, não parece haver problema em lugar nenhum.
Johannes de

Respostas:

171

Você deve remover as referências a ele atribuindo nulo ou deixando o bloco onde foi declarado. Depois disso, ele será excluído automaticamente pelo coletor de lixo (não imediatamente, mas eventualmente).

Exemplo 1:

Object a = new Object();
a = null; // after this, if there is no reference to the object,
          // it will be deleted by the garbage collector

Exemplo 2:

if (something) {
    Object o = new Object(); 
} // as you leave the block, the reference is deleted.
  // Later on, the garbage collector will delete the object itself.

Não é algo que você esteja procurando atualmente, mas para sua informação: você pode invocar o coletor de lixo com a chamada System.gc ()

MByD
fonte
23
Ter que chamar manualmente System.gc()geralmente não é uma boa ideia , já que pode realmente ser ignorado pela JVM.
cdeange
3
Não é uma boa ideia, mas você também pode chamar semelhante a System .. Runtime.getRuntime (). Gc (). Mais informações: as rotinas de coleta de lixo que o Java fornece são membros da classe Runtime. A classe Runtime é uma classe especial que possui um único objeto (um Singleton) para cada programa principal. O objeto Runtime fornece um mecanismo para comunicação direta com a máquina virtual. Para obter a instância Runtime, você pode usar o método Runtime.getRuntime (), que retorna o Singleton.
Timo
1
A nullatribuição é um sinal definitivo para o GC de que este objeto deve ser limpo com Garbaged na próxima invocação do GC? * Atribuir nulla objetos de coleção (listas, matrizes) marca-os para limpeza? stackoverflow.com/questions/449409/…
George Daramouskas
Portanto, devo tornar todos os meus textviews e imagebuttons nulos no onPause?
Ruchir Baronia de
Não há garantia de que o coletor de lixo algum dia será executado ou que, se for, ele coletará (não 'excluirá') qualquer objeto específico.
Marquês de Lorne
64

Seu C ++ está aparecendo.

Não há delete em java, e todos os objetos são criados no heap. A JVM possui um coletor de lixo que conta com contagens de referência.

Quando não houver mais referências a um objeto, ele se tornará disponível para coleta pelo coletor de lixo.

myObject = nullpode não fazer isso; por exemplo:

Foo myObject = new Foo(); // 1 reference
Foo myOtherObject = myObject; // 2 references
myObject = null; // 1 reference

Tudo o que isso faz é definir a referência myObjectcomo nula, não afeta o objeto myObjectuma vez apontado, exceto para simplesmente diminuir a contagem de referência em 1. Uma vez que myOtherObjectainda se refere a esse objeto, ele ainda não está disponível para ser coletado.

Brian Roach
fonte
Portanto, devo tornar todos os meus textviews e imagebuttons nulos no onPause?
Ruchir Baronia de
8
"A JVM possui um coletor de lixo que conta com contagens de referência." -> essa é uma explicação muito simplificada. Ele verifica se os objetos são alcançáveis ​​a partir de uma "raiz" específica
Johannes
2
A JVM possui um coletor de lixo que especificamente não depende de contagens de referência. Ele depende da acessibilidade. Se dependesse de contagens de referência, nunca poderia coletar ciclos, e realmente o faz.
Marquês de Lorne
14

Se você quiser ajudar um objeto a desaparecer, defina sua referência como null.

String x = "sadfasdfasd";
// do stuff
x = null;

Definir a referência como null tornará mais provável que o objeto seja coletado como lixo, desde que não haja outras referências ao objeto.

John Percival Hackworth
fonte
Sempre que faço isso, quando meu objeto se cruza, todo o meu jogo congela e não deleta o objeto.
Stan,
Porque você provavelmente está lançando uma exceção de ponteiro nulo não capturada. Mais contexto certamente nos ajudaria a orientar você nesse processo.
Joseph Weissman
Portanto, devo tornar todos os meus textviews e imagebuttons nulos no onPause?
Ruchir Baronia de
Se você realmente precisa que eles desapareçam, isso acabará eventualmente.
John Percival Hackworth de
3

Você não precisa excluir objetos em java. Quando não houver referência a um objeto, ele será coletado pelo coletor de lixo automaticamente.

fmucar
fonte
Portanto, devo tornar todos os meus textviews e imagebuttons nulos no onPause?
Ruchir Baronia de
0

Você pode remover a referência usando null.

Digamos que você tenha aula A:

A a = new A();
a=null;

A última instrução removerá a referência do objeto ae esse objeto será "coletado como lixo" pela JVM. É uma das maneiras mais fáceis de fazer isso.

Lakhan
fonte
Portanto, devo tornar todos os meus textviews e imagebuttons nulos no onPause?
Ruchir Baronia de
-3

Sim, java é coletado como lixo, ele excluirá a memória para você.

Jake Kalstad
fonte
37
no momento menos esperado
matcheek
2
s / delete / vazamento / g
Mark K Cowan
-6
//Just use a List
//create the list
public final List<Object> myObjects;

//instantiate the list
myObjects = new ArrayList<Object>();

//add objects to the list
Object object = myObject;
myObjects.add(object);

//remove the object calling this method if you have more than 1 objects still works with 1
//object too.

private void removeObject(){
int len = myObjects.size();
for(int i = 0;i<len; i++){
Objects object = myObjects.get(i);
myObjects.remove(object);
}
}
user3124852
fonte
A razão pela qual esta resposta está incorreta é porque ela remove apenas uma referência ao objeto, e não o próprio objeto real.
Ben Morris
A razão pela qual esta resposta está incorreta porque mostra como você pode remover um objeto de uma lista - essa não era a questão.
phil