我正在慢慢研究 Bruce Eckel 的Thinking in Java 4th edition,以下问题让我很困惑:
创建一个带有 finalize( ) 方法的类,该方法打印一条消息。在 main( ) 中,创建你的类的一个对象。修改前面的练习,以便始终调用您的 finalize()。
这是我编码的:
public class Horse {
boolean inStable;
Horse(boolean in){
inStable = in;
}
public void finalize(){
if (!inStable) System.out.print("Error: A horse is out of its stable!");
}
}
public class MainWindow {
public static void main(String[] args) {
Horse h = new Horse(false);
h = new Horse(true);
System.gc();
}
}
它创建一个Horse
布尔值inStable
设置为的新对象false
。现在,在该finalize()
方法中,它检查是否inStable
为false
。如果是,它会打印一条消息。
不幸的是,没有打印任何消息。由于条件评估为true
,我的猜测是它finalize()
一开始就没有被调用。我已经多次运行该程序,并且只看到错误消息打印了几次。我的印象是,当System.gc()
被调用时,垃圾收集器将收集任何未引用的对象。
谷歌搜索一个正确的答案给了我这个链接,它提供了更详细、更复杂的代码。它使用我以前从未见过的方法,例如System.runFinalization()
、Runtime.getRuntime()
和System.runFinalizersOnExit()
。
有没有人能让我更好地理解它是如何finalize()
工作的以及如何强制它运行,或者让我了解解决方案代码中正在做什么?