java - <Thinking in java, 4th Edition>中的finalize方法

标签 java finalize

<分区>

我正在阅读Thinking in Java,第 4 版。我发现一个问题:当我在Eclipse IDE中测试源代码时,发现结果不一样。我希望有人能帮助我!

这里是源码

class Book {
    boolean checkedOut = false;

    Book(boolean checkOut) {
        checkedOut = checkOut;
    }

    void checkIn() {
        checkedOut = false;
    }

    protected void finalize() {
        if(checkedOut)
            System.out.println("Error:checked out");  
            //Normally,you'll also do this:
            //super.finalize();//Call the base-class version
    }
}


public class TerminationCondition {
    public static void main(String[]args) {
        Book novel=new Book(true);

        //Proper cleanup:
        novel.checkIn();

        //Drop the reference,forget to clean up:
        new Book(true);
        new Book(true);
        new Book(true);

        //Force garbage collection & finalization:
        System.gc();
    }
}

本书的结果:

Error: Checked out

IDE的结果

(nothing)

我使用的 Java 版本:

Java 版本“1.7.0_51”
Java(TM) SE 运行时环境 (build 1.7.0_51-b13)
Java HotSpot(TM) 64 位服务器 VM(构建 24.51-b03,混合模式)

本书中的 Java 版本是 Java 5。finalize 方法有什么变化吗?

最佳答案

JVM 有自己的垃圾回收管理策略,即使你单独调用 finalize() 也行! JVM 的优化使得用户不需要干预垃圾内存清理过程。

所以,您所观察到的与 Java 版本或任何东西都无关!它完全依赖于 JVM 及其自动内存管理策略。

关于java - <Thinking in java, 4th Edition>中的finalize方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25830592/

相关文章:

java - 为什么对服务对象有静态弱引用?

java - 在 Java 中将许多对象引用初始化为默认值的最佳方法(代码风格)

java - 通过在垃圾收集之前使用反射来清理内容,安全地使用 String 作为密码

Java - 程序末尾的对象不是 "garbage collected"吗?

java - 共享OpenGL资源: delete with finalize() or implement reference counting?

java - Java中的finalize()方法什么时候被调用?

java - 过程模型Delta

java - 如何跟踪从应用服务器提交到 Oracle 数据库的所有查询?

Java从字符串中解析日期

java - 为什么在Java 9中不推荐使用finalize()方法?