如何销毁对象本身

23

有没有办法在对象内部销毁当前实例?

我正在寻找类似如下的解决方案:

class KillMe {
    ....
    public void destroy() {
        this.getObject = null //this is only for demonstrate my idea
    }

    ....
}

4
为什么你想这样做呢?不管怎样,Java对象除了垃圾回收器外,没有任何其他东西可以“销毁”它们。 - skaffman
在Java中,您无法销毁对象,垃圾收集器会在您不再使用它们并且所有引用都被释放时进行销毁。 - raym0nd
1
如果这是可能的话,我可以编写有趣的构造函数,立即销毁某人想要创建的对象,或者我可以安装漂亮的隐藏NullPointerExceptions ;) - Tim Schmelter
我认为这不是关于对象的哪个上下文的问题。 - Smolda
Tim:你说得对 :) 我并没有说这是我想要走的路线:] 我只是在想是否有可能或者是否有其他解决方案。 - Smolda
显示剩余4条评论
4个回答

29

Java对象会一直存在,直到没有任何引用指向它。因为一个对象无法确定有多少引用指向它,所以一个对象不能“自毁”。


4

该对象没有访问对自身的引用的权限,因此无法将其设置为null或其他值。只有当垃圾回收器遍历清除所有未被引用的对象时,该对象才能被“销毁”。

话虽如此,请尝试以下操作:

public void destroy() {
    System.exit( 0 );
}

3
你对 One should NEVER call System.exit(0) 有什么看法?(意思是不应该调用System.exit(0)) - Mark Cramer

3

不,对象不能自杀。任何对它本身的引用都只是一个引用。

要在对象内部“清除”对象,只需清除所有实例变量即可。

要在对象外部“清除”对象,只需将变量设置为null。


0

您想要做的示例表明您没有理解对象何时被销毁/清除的方式。

class KillMe {
    ....
    public void destroy() {
        this.getObject = null //this is only for demonstrate my idea
    }
}

你所调用的方法 (this.getObject) 获取了当前对象的引用,然后将该引用设置为 null(即不再指向当前对象)。它不会对对象本身进行任何操作,也不会改变代码中其他指向该对象的变量。

可以这样考虑... 变量指向值(对象)。只要还有变量指向某个值,该值就会被保留(不会被垃圾回收/销毁)。为了删除所有指向某个值的变量引用,您需要找到所有指向它的变量,并将它们指向其他东西(例如 null)。实际上,您无法做到这一点(尽管我认为通过足够可怕的反射和/或字节码魔术,没有什么是不可能的;)

换个角度思考,如果您能够销毁值/对象本身,那么所有当前指向它的其他变量会发生什么?它们现在指向已释放的内存,导致某种 Java 版本的段错误吗?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接