返回介绍

4.3.1 finalize() 用途何在

发布于 2024-10-15 23:56:14 字数 865 浏览 0 评论 0 收藏 0

此时,大家可能已相信了自己应该将 finalize() 作为一种常规用途的清除方法使用。它有什么好处呢?

要记住的第三个重点是:

垃圾收集只跟内存有关!

也就是说,垃圾收集器存在的唯一原因是为了回收程序不再使用的内存。所以对于与垃圾收集有关的任何活动来说,其中最值得注意的是 finalize() 方法,它们也必须同内存以及它的回收有关。

但这是否意味着假如对象包含了其他对象,finalize() 就应该明确释放那些对象呢?答案是否定的——垃圾收集器会负责释放所有对象占据的内存,无论这些对象是如何创建的。它将对 finalize() 的需求限制到特殊的情况。在这种情况下,我们的对象可采用与创建对象时不同的方法分配一些存储空间。但大家或许会注意到,Java 中的所有东西都是对象,所以这到底是怎么一回事呢?

之所以要使用 finalize(),看起来似乎是由于有时需要采取与 Java 的普通方法不同的一种方法,通过分配内存来做一些具有 C 风格的事情。这主要可以通过“固有方法”来进行,它是从 Java 里调用非 Java 方法的一种方式(固有方法的问题在附录 A 讨论)。C 和 C++是目前唯一获得固有方法支持的语言。但由于它们能调用通过其他语言编写的子程序,所以能够有效地调用任何东西。在非 Java 代码内部,也许能调用 C 的 malloc() 系列函数,用它分配存储空间。而且除非调用了 free(),否则存储空间不会得到释放,从而造成内存“漏洞”的出现。当然,free() 是一个 C 和 C++函数,所以我们需要在 finalize() 内部的一个固有方法中调用它。

读完上述文字后,大家或许已弄清楚了自己不必过多地使用 finalize()。这个思想是正确的;它并不是进行普通清除工作的理想场所。那么,普通的清除工作应在何处进行呢?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文