在Java中删除对象?


99

我想删除我创建的对象(跟随您的椭圆形),但是我该怎么做?

delete follower1;

没用。

编辑:

好的,我再说些背景。我正在制作一个小型游戏,它具有您可以控制的椭圆形以及跟随您的椭圆形。现在,我有一个名为DrawPanel.class的文件,该类在屏幕上绘制所有内容,并处理碰撞,声音等。我得到了敌人.class,它是播放器后面的椭圆形。我有一个entity.class,它是您可以控制的播放器。如果播放器与跟随者相交,我希望删除播放器对象。我这样做的方式:

    public void checkCollisions(){
    if(player.getBounds().intersects(follower1.getBounds())){
        Follower1Alive = false;
        player.health = player.health - 10;
    }
}

1
您能否提供更多背景信息?
Joseph Weissman

2
Java中没有删除对象。但是您通常不需要:您需要确保屏幕上不再显示任何内容(如果这是“跟随您”所做的事情)。
圣保罗Ebermann

也许您想尝试强制垃圾收集器删除对象?这里已经有一个问题。还是您尝试其他方法?您可以尝试在此处此处阅读一些有关垃圾收集器的信息如果仍然没有帮助,则需要更加具体。
Fawix


如果您真的真的想手动处理对象分配,请使用JNI:创建一个C / C ++库,该库可从Java代码中使用,但所有操作(创建,删除等)都由它自己完成-但是在您的库中,您拥有C / C ++代码,没有Java。我没有看到任何手动删除Java对象的方法。如果您的探查器告诉您存在问题,则这些问题通常基于对对象的“已忘记”引用。就您而言,似乎在任何地方都没有问题。
约翰内斯

Answers:


171

您应该通过分配null或将其保留在声明该块的位置来删除对其的引用。之后,它将被垃圾收集器自动删除(不是立即删除,而是最终删除)。

范例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

范例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.

仅供参考:您可以通过调用System.gc()来调用垃圾收集器


23
System.gc()通常,手动调用不是一个好主意,因为JVM实际上可能会忽略它。
cdeange

3
这不是一个好主意,但是您也可以调用类似于System .. Runtime.getRuntime()。gc()的方法。更多信息:Java提供的垃圾回收例程是Runtime类的成员。Runtime类是一个特殊的类,每个主程序都有一个对象(一个Singleton)。运行时对象提供了一种直接与虚拟机通信的机制。要获取Runtime实例,可以使用方法Runtime.getRuntime(),该方法返回Singleton。
Timo

1
是否null为GC分配了明确的符号,表明该对象将在下一次GC调用中进行垃圾袋清洁?*分配null给收集对象(列表,数组)会将其标记为清洁? stackoverflow.com/questions/449409/...
乔治Daramouskas

所以我应该使所有的textviews和imagebuttons为null onPause吗?
Ruchir Baronia's

无法保证垃圾收集器会运行,或者保证垃圾收集器将收集(而不是“删除”)任何特定对象。
罗恩侯爵

64

您的C ++正在显示。

deleteJava 中没有,所有对象都在堆上创建。JVM具有依赖引用计数的垃圾收集器。

一旦不再有对对象的引用,垃圾收集器就可以使用该对象进行引用。

myObject = null可能不会这样做;例如:

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

所有这一切都将引用设置myObject为null,它只myObject对引用计数减1 不会影响曾经指向的myOtherObject对象,因为仍然引用该对象,因此尚无法收集该对象。


所以我应该使所有的textviews和imagebuttons为null onPause吗?
Ruchir Baronia's

8
“ JVM具有依赖引用计数的垃圾收集器。” ->这是一个非常简单的解释。它检查对象是否可以从特定的“根”访问
Johannes

2
JVM有一个垃圾收集器是专门就不能依靠引用计数。它依赖于可达性。如果依靠引用计数,它将永远无法收集周期,而且确实可以。
罗恩侯爵

14

如果要帮助对象消失,请将其引用设置为null。

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

只要没有其他对对象的引用,将reference设置为null将使该对象更有可能被垃圾回收。


每当我这样做时,当我的对象相交时,我的整个游戏就会冻结,并且不会删除该对象。
Stan

因为您可能会抛出未捕获的空指针异常。当然,更多的背景信息将帮助我们指导您完成此任务。
Joseph Weissman

所以我应该使所有的textviews和imagebuttons为null onPause吗?
Ruchir Baronia's

如果您真的需要他们离开,那最终会做到的。
John Percival Hackworth'1

3

您无需删除Java中的对象。如果没有对对象的引用,垃圾收集器将自动对其进行收集。


所以我应该使所有的textviews和imagebuttons为null onPause吗?
Ruchir Baronia's

0

您可以使用删除参考null

假设您上课A

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

最后一条语句将删除该对象的引用,a并且该对象将被JVM“垃圾收集”。这是最简单的方法之一。


所以我应该使所有的textviews和imagebuttons为null onPause吗?
Ruchir Baronia's


-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);
}
}

这个答案不正确的原因是因为它仅删除了对对象的引用,而不是实际对象本身。
本莫里斯

这个答案之所以不正确,是因为它说明了如何从列表中删除对象-这不是问题。
菲尔
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.