【问题标题】:Deleting an object in java?在java中删除一个对象?
【发布时间】:2016-07-28 19:46:50
【问题描述】:

我想删除我创建的一个对象(一个跟随你的椭圆),但我该怎么做呢?

delete follower1;

没用。

编辑:

好的,我将提供更多背景信息。我正在制作一个您可以控制的椭圆形小游戏,以及一个跟随您的椭圆形。现在我有了名为:DrawPanel.class 的文件,这个类在屏幕上绘制所有内容,并处理碰撞、声音等。我有一个敌人.class,它是跟随玩家的椭圆形。我有一个 entity.class,它是你可以控制的播放器。如果玩家与追随者相交,我希望我的玩家对象被删除。我这样做的方式:

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

【问题讨论】:

  • 你能提供更多的上下文吗?
  • Java 中没有删除对象。但您通常不需要:您需要确保屏幕上不再显示任何内容(如果这是“跟随您”所做的)。
  • 也许您想尝试强制垃圾收集器移除一个对象?已经有一个关于它的问题here。或者也许你在尝试别的东西?您可以尝试阅读有关垃圾收集器 herehere 的信息,如果仍然没有帮助,您需要更具体。
  • 如果您真的很想手动处理对象分配,请使用 JNI:创建一个 C/C++ 库,该库可从 Java 代码中使用,但可以自行完成所有操作(创建、删除等) -但是在您的库中,您有 C/C++ 代码,没有 Java。我还没有看到任何手动删除 Java 对象的方法。如果您的分析器告诉您存在问题,这些问题通常基于对对象的“忘记”引用。在您的情况下,任何地方似乎都没有问题。

标签: java


【解决方案1】:

您应该通过分配 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() 来调用垃圾收集器

【讨论】:

  • 必须手动调用System.gc() 通常是not a good idea,因为它实际上可能会被JVM 忽略。
  • 不是一个好主意,但你也可以调用类似于 System..Runtime.getRuntime().gc()。更多信息:Java 提供的垃圾收集例程是 Runtime 类的成员。 Runtime 类是一个特殊的类,它对每个主程序都有一个对象(一个 Singleton)。 Runtime 对象提供了一种与虚拟机直接通信的机制。要获取 Runtime 实例,可以使用方法 Runtime.getRuntime(),它返回 Singleton。
  • 是否将null 分配给GC 一个明确的信号,表明该对象将在下一次GC 调用中被垃圾清理?* 将null 分配给集合对象(列表、数组)标记它们以进行清理? stackoverflow.com/questions/449409/…
  • 所以我应该将onPause中的所有文本视图和图像按钮设为空?
  • 无法保证垃圾收集器会一直运行,或者如果运行,它会收集(而不是“删除”)任何特定对象。
【解决方案2】:

你的 C++ 正在显示。

java中没有delete,所有对象都是在堆上创建的。 JVM 有一个依赖于引用计数的垃圾收集器。

一旦不再有对某个对象的引用,它就可以被垃圾收集器收集。

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

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

所有这一切都是将引用myObject设置为null,它不会影响对象myObject一旦被指向除了简单地将引用计数减1。由于myOtherObject仍然引用该对象,所以它是暂时无法收集。

【讨论】:

  • 所以我应该将onPause中的所有文本视图和图像按钮设为空?
  • “JVM 有一个依赖于引用计数的垃圾收集器。” -> 这是一个非常简单的解释。 It checks whether objects are reachable from a specific "root"
  • JVM 有一个垃圾收集器,它专门依赖引用计数。它依赖于可达性。如果它依赖于引用计数,它永远无法收集循环,而且确实如此。
  • 有没有办法在将标识符设置为空后使其无效?我并不是建议将它用于另一个指向不同类型或其他东西的指针(在同一范围内将 2 个标识符用于不同的东西通常是不明智的。为什么不使用 2 个不同的名称?);如果我在将其设置为 null 后尝试使用该标识符,我可能只想让编译器对我大喊大叫。
【解决方案3】:

如果您想帮助某个对象消失,请将其引用设置为 null。

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

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

【讨论】:

  • 每当我这样做时,当我的对象相交时,我的整个游戏都会冻结,并且不会删除对象。
  • 因为您可能会抛出未捕获的空指针异常。更多背景信息肯定会帮助我们指导您完成此操作。
  • 所以我应该将onPause中的所有文本视图和图像按钮设为空?
  • 如果你真的需要他们离开,那么最终会做到的。
【解决方案4】:

您不需要在 java 中删除对象。当对象没有引用时,垃圾回收器会自动回收。

【讨论】:

  • 所以我应该将onPause中的所有文本视图和图像按钮设为空?
  • @RuchirBaronia 没有。它们仍然被您的 AppCompatActivity 引用,但如果 AppCompatActivity 不再被引用,它们将被删除。
【解决方案5】:

您可以使用null 删除引用。

假设你有课 A:

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

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

【讨论】:

  • 所以我应该将onPause中的所有文本视图和图像按钮设为空?
【解决方案6】:

Java 有一个垃圾收集器,如果不再有对它的引用,它会为您删除该对象。

【讨论】:

  • 在最意想不到的时刻
  • s/delete/leak/g
  • Java 垃圾收集器臭名昭著,如果有很多对象要清理,它会锁定主线程长达半秒。我的世界是这个问题的一个臭名昭著的例子。所以在这种情况下,你可能不想使用垃圾收集器是有充分理由的。
【解决方案7】:
//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);
}
}

【讨论】:

  • 这个答案不正确的原因是它只删除了对对象的引用,而不是实际的对象本身。
  • 这个答案不正确的原因是因为它显示了如何从列表中删除一个对象 - 这不是问题。
猜你喜欢
  • 2014-09-01
  • 1970-01-01
  • 2013-06-03
  • 2016-11-14
  • 2015-09-12
  • 1970-01-01
  • 2011-11-05
  • 1970-01-01
相关资源
最近更新 更多