Java 8 关于 Finalize 方法的断言正确吗?

我一直在阅读 Kathy Sierra + Bert Bates 撰写的《OCA Java SE 8 程序员 I 考试指南》一书。

关于 Finalize 方法,我不太明白。第 218 页指出:

调用finalize()实际上可以导致保存对象免遭删除。

稍后第 222 页:

您可以从内部使对象不符合 GC 条件finalize()

英语不是我的母语,但我在这两种情况下的理解是该finalize()方法可以防止对象被垃圾收集?是这样吗?还是我误解了它?


慕田峪4524236
浏览 106回答 3
3回答

慕工程0101907

这实际上更像是一个理论上的事情:当对象不再被其他活动对象引用时,它们就有资格进行垃圾回收。因此:您可以尝试在finalize(). 从理论上讲,这将阻止该物体被移除。实际上有一个“模式名称”:对象复活。现在,这是一种模式,还是更多的反模式,值得争论。(就我个人而言:我永远不会这样做,而且我从来没有遇到过需要使用这种模式的情况)

狐的传说

Finalize 是由 JVM 而不是由用户调用的方法,该方法在对象被垃圾收集之前执行,您可以重写 Finalize 方法以在对象被处置之前执行清理操作,或者正如书中所述,有可能您可以防止该对象被垃圾收集。您可以参考下面的代码作为避免对象被垃圾收集的示例。class Example {     static Example y;     void func() {         Example x = new Example();     }     pubic void finalize() {         y = this; // Putting the reference id         // of the current object         // into the static variable y         System.out.println("The object won't be collected by the garbage collector");     }     public static void main(String a[]) {        func(); // function called     } }

阿晨1998

嗯,确实如此。finalize()当 GC 决定应该删除该对象时,将调用该方法,但这并不意味着该对象将在finalize完成后立即被删除。IT DOESN'T WORK THIS WAY:_________________________IF shouldBeRemoved(object)   object.finalize();   remove(object);执行后finalize,GC将再次检查该对象是否仍应被删除。为了符合删除资格,不应从可从根对象访问的任何对象引用对象。IT WORKS THIS WAY_________________LABELIF shouldBeRemoved(object)    object.finalize();    IF shouldBeRemoved(object)        remove(object);    ELSE        GOTO LABEL让我们想象一下以下情况:class Foo {    Application a;    Foo(){};    @Override    public void finalize() {        this.a = Application.getInstance();    }}其中Application是代表 的根对象的类Application。在这种情况下,由于a仍然可达,Foo之前符合删除资格的类的对象刚刚复活。重要说明不能保证 会finalize被调用,因为它需要另一个对象来处理finalize被调用的方法,因此如果堆上没有足够的可用空间,对象可能会在不调用的情况下被销毁finalize。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java