从类中删除java中的对象

从类中删除java中的对象,java,object,Java,Object,如何从它的类中删除java对象。假设我有一门课,比如: class A { int hp; public void update() { if(hp <= 0) { //here comes the problem. Something like: this.delete(); ?? } } } 您正试图“释放”对象的内存,但不幸的是,没有一种适合所有对象的解决方案。必须将对对象的所有

如何从它的类中删除java对象。假设我有一门课,比如:

class A
{
    int hp;
    public void update()
    {
        if(hp <= 0)
        {
            //here comes the problem. Something like: this.delete(); ??
        }
    }
}
您正试图“释放”对象的内存,但不幸的是,没有一种适合所有对象的解决方案。必须将对对象的所有活动引用设为空。同样,这一切都取决于上下文,取决于哪些变量引用了您感兴趣的对象。这样做,当GC决定需要进行GC’ing时,它将释放引用,这是我们无法控制的,但只能向GC提出建议


您在评论中声明:

假设A是一个苏打者,如果它被杀了,我想把他删除

然后将他从士兵任务列表中删除,可能是数据库或阵列列表


最好在尽可能有限的范围内声明变量,在不再需要时让它们自然地从所有引用中释放出来,并对代码进行概要分析,以便您可以看到它何时遇到麻烦


您在评论中声明:

是的,对象位于ArrayList中,幸运的是它是公共的和静态的,所以问题就解决了。谢谢你宽泛的解释


不,这是不对的。ArrayList不应该是静态的,也不应该是公共的,而应该是私有实例字段。将字段设置为静态意味着不能以面向对象的方式使用它。公开意味着任何对象都可以在任何时候对其进行变异,而在复杂的程序中,这会导致难以跟踪的问题,并增加圈复杂度。它应该只能通过持有它的类的公共方法以受控的方式可变。很抱歉,但是你的程序设计听起来有缺陷,这意味着你将要审查、重构、改进它。如何,很难说是基于信息片段。

在Java中,不能显式地从内存中删除对象。好在这是由我们所说的“垃圾收集器”处理的。运行此操作时,它会查找没有引用的对象并删除它们。因此,您唯一能做的就是删除对该对象的所有引用(让它们超出范围,将它们设置为null,无论什么),然后等待GC运行


没有办法强制GC运行,但是,您可以从技术上“鼓励”它使用
System.GC()
方法运行。然而,这并不保证它会运行,而且除了边缘情况之外,不需要任何东西。

< P>即使C++必须清除对象的指针/引用,然后才可以安全地释放它的内存。在Java中,这是您所要做的全部,其余的都由它来完成

更新(这是我要删除对象的位置)

这意味着您要将其从ArrayList中删除。你也可以

  • 立即执行,但这需要引用对象所在的列表
  • 或删除发现时的无效项,例如,在遍历列表时

请定义“删除”?请提供一些上下文,任何上下文。比如释放记忆?我想你们误解了他的问题。从他提供的最小代码中查看上下文。假设
hp
代表生命值,那么他似乎正试图管理
实体的
集合
,也许他想将其从他的
集合
中删除。。。我不知道。一个对象在没有更多的强引用后可以被释放。i、 e.当您不再需要它时,它会被删除。@HongWeiWang您可以将引用设置为null。不是一个物体。取消引用主要是浪费时间。我还没想过,谢谢!请给我术语。空所有引用。。。GC将释放该对象。@user2466076即使是一个可访问的强引用也会使对象保持活动状态,因为它可能仍然需要。@user2466076(a)否(b)是。所有这些都已经告诉您好几次了。ArrayList是静态的,因为它是一个通用的实例列表。它位于外部文件中。我在许多不同的地方使用它,所以我需要它公开
init(called when the game starts to load images)

update(this is where i want to delete the object) 

draw(for rendering)