当前位置: 首页 > 面试题库 >

如何确保始终调用finalize()(Java练习中的思考)

堵宪
2023-03-14
问题内容

我正在慢慢阅读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()方法中,它检查是否inStablefalse。如果是,它将打印一条消息。

不幸的是,没有消息被打印。由于条件的计算结果为true,所以我猜测finalize()不是一开始就被调用。我已多次运行该程序,并且看到错误消息仅打印了两次。我的印象是,当System.gc()被调用时,垃圾收集器将收集所有未引用的对象。

谷歌搜索正确答案给了我这个链接,它给出了更详细,更复杂的代码。它使用我以前没有见过的方法,如System.runFinalization()Runtime.getRuntime()System.runFinalizersOnExit()

有谁能够使我更好地了解其finalize()工作方式以及如何使其运行,或者引导我完成解决方案代码中的工作?


问题答案:

当垃圾收集器找到一个有资格进行收集但有一个对象的对象时,finalizer它不会立即取消分配它。垃圾收集器试图尽快完成,因此它只是将对象添加到具有待定终结器的对象列表中。终结器稍后在单独的线程上调用。

通过System.runFinalization在垃圾回收之后调用该方法,可以告诉系统立即尝试运行挂起的终结器。

但是,如果要 强制 运行终结器,则必须自己调用它。垃圾收集器不 保证
将收集任何对象或将调用终结器。这只是“尽力而为”。但是,很少需要强制终结器以实际代码运行。



 类似资料:
  • 我想四舍五入任何双到一个字符串2小数位在Java。我尝试过使用十进制格式,但它没有给出预期的结果。任何帮助将不胜感激。 Ex: I/P:3402100.5323 我想将其转换为: O/P: 34.02 我尝试过使用DecimalFormat(“###,##,##,###0.00”,新的DecimalFormatSymbols(Locale.US))但结果是340210.53,而我希望它输出34.0

  • 要成为一个优秀的前端工程师,需要什么技能和学习?答案:练习 在逛知乎、SegmentFault 又或者是相似的技术社区,我们总会看到类似的问题。新手总会关注于,需要怎样的技能,怎么才能入门?有一点经验的程序员则是,需要练习什么?如若一个程序 员已经懂得问题的关键是,编程需要大量的练习。那么,我想这个程序员已经入了这个行道了。 在我成为所谓的『前端工程师』之前,我没有想到会变成这样的结果。 前端项目

  • 问题内容: 我有一个在控制台窗口中运行的简单Python脚本。 如何确保控制台窗口始终位于顶部,并在可能时调整其大小? 问题答案: 要在cmd窗口中执行此操作,您可能必须调用许多win32调用。 使用win32gui.EnumWindows枚举所有窗口以获取窗口句柄 找到与您的程序运行方式匹配的“窗口标题”。例如,在我的系统上双击.py文件,窗口标题为“ C:\ Python26 \ python

  • 我想一直保持横向模式。我在Nexus7上将屏幕锁定为纵向模式,在AndroidManifest中设置android:screenOrientation=“Sensor横向”和android:configChanges=“orientation | keyboardHidden”。xml,当我转到其他活动并返回到此活动时,屏幕将再次旋转纵向和横向(没有再次调用onCreate方法),但我不想在任何情

  • 问题内容: 我需要知道何时在中调用该方法。我创建了一个测试类,该法通过覆盖该方法来在调用该方法时将其写入文件。它不执行。谁能告诉我它为什么不执行的原因? 问题答案: 通常,最好不要依赖进行任何清理等工作。 根据Javadoc(值得阅读),它是: 当垃圾回收确定不再有对该对象的引用时,由垃圾回收器在对象上调用。 正如Joachim指出的那样,如果对象始终是可访问的,则在程序生命中可能永远不会发生这种

  • 本文向大家介绍详解vuex中action何时完成以及如何正确调用dispatch的思考,包括了详解vuex中action何时完成以及如何正确调用dispatch的思考的使用技巧和注意事项,需要的朋友参考一下 在项目中遇到关于action与dispatch使用的一些细节问题,经过搜索得到了一些答案。 特意在此提出,如有错误还请指出,十分感谢~ 问题1:如果action是异步的,那么怎么知道它什么时候