我正在慢慢地学习Bruce Eckel的《Java编程思想》第四版,以下问题让我感到困惑:
创建一个带有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()
如何工作,如何强制其运行,或者指导我如何理解解决方案代码?
System.gc()
实际上会回收任何东西。 - Niklas B.h = new Horse(true);
我将 h 设置为一个新的对象,使之前的对象(其中 inStable 被设置为 false)成为无引用状态。 - MattDs17