2010-11-20 75 views
1

所以在我的程序中,我有几个不同的对象存储在一个数组中。我随机生成一个数字,它是数组中的一个索引,并克隆该对象(九次),以在屏幕上制作一个3x3的对象网格。删除Java中的对象

现在我的问题是,我有我的3X3网格后,我想能够擦除,并在数组中生成一个新的网格对象。问题是我想不出如何摆脱所有这些克隆,除非将它们从显示器中移出,这看起来像是浪费了内存。我想做400次试验,所以最终会有很多克隆物体。

有没有办法可以删除这些克隆的对象?我必须创建新的对象,因为我的数组中的一个对象可能会在网格中使用两次。

+0

您应该将显示与逻辑分开。然后,这成为一个非问题。(在一个现代系统中,即使是混乱和混乱的概念,它也可能不是问题。) – 2010-11-20 18:49:23

回答

2

我想java垃圾收集器会为你做。 当一个对象没有被任何人引用时,当系统识别出这个对象时它将被删除;但是当你说“将它们移出显示器”时,你是什么意思?如果它们是“图形对象”,它们应该位于其他对象(如JFrame)内部,因此您必须使用一种方法来告诉JFrame对象(或其他对象)抛出引用或用另一个引用覆盖引用。

0

它有助于认识到你没有处理实际的对象,你正在处理指向内存中对象的指针或引用。所以:

Object obj = new Object(); 

不是一个对象,而是一个指向内存中对象的链接。通过将链接设置为空或将其替换为另一个对象的链接来删除链接,旧对象将被删除... ish。当垃圾收集运行时,它将被删除。所以:

obj = null; 

obj = new Object(); 

基本上将删除旧的对象。这同样适用于对象数组,您不是处理实际对象数组,而是处理对象链接数组。因此,通过将数组中的位置设置为null或将位置设置为新对象,旧对象将被删除。所以:

ObjArray[4] = null; 

ObjArray[4] = new Object; 

将删除旧的对象。

编辑:我猜我忘了提及的东西,内存中的单个对象可以有多个链接,直到所有这些链接都被删除,对象才能被垃圾回收删除。

Object obj = new Object(); 
ObjArray[4] = obj; 
obj=null; 

在上述情况下,最初创建不会被删除时的obj设置为null的对象,这是因为它的链接在ObjArray仍然存在。在对象消失之前,必须将obj和ObjArray [4]都设置为null。

+0

谢谢,但由于某种原因,如果我执行代码: Target t = new Target(x,y); t = null; 然后当我在我的显示器上仍然显示图形,那么有没有办法强制垃圾收集器做它的工作或什么? – Douglas 2010-11-20 20:16:37

+0

@Douglas单独关注。那么这将是有道理的。 – 2010-11-20 20:38:18

+0

@Douglas,多加了一些关于多个参考文献的回答。 – phill 2010-11-20 20:56:05

0

因为引用仍然保留在容器内。我认为你已经做了类似的事情:myJFrameObject.getContentPane.add(object_to_display);因此引用位于myJFrameObject内部,您可以使用myJFrameObject.getContentPane.remove作为示例。如果你想要,你可以使用setVisible(false)来隐藏框架。这取决于实际情况。