- 写在前面的话
- 引言
- 第 1 章 对象入门
- 第 2 章 一切都是对象
- 第 3 章 控制程序流程
- 第 4 章 初始化和清除
- 第 5 章 隐藏实施过程
- 第 6 章 类再生
- 第 7 章 多形性
- 第 8 章 对象的容纳
- 第 9 章 违例差错控制
- 第 10 章 Java IO 系统
- 第 11 章 运行期类型鉴定
- 第 12 章 传递和返回对象
- 第 十三 章 创建窗口和程序片
- 第 14 章 多线程
- 第 15 章 网络编程
- 第 16 章 设计范式
- 第 17 章 项目
- 附录 A 使用非 JAVA 代码
- 附录 B 对比 C++和 Java
- 附录 C Java 编程规则
- 附录 D 性能
- 附录 E 关于垃圾收集的一些话
- 附录 F 推荐读物
4.3.1 finalize() 用途何在
此时,大家可能已相信了自己应该将 finalize() 作为一种常规用途的清除方法使用。它有什么好处呢?
要记住的第三个重点是:
垃圾收集只跟内存有关!
也就是说,垃圾收集器存在的唯一原因是为了回收程序不再使用的内存。所以对于与垃圾收集有关的任何活动来说,其中最值得注意的是 finalize() 方法,它们也必须同内存以及它的回收有关。
但这是否意味着假如对象包含了其他对象,finalize() 就应该明确释放那些对象呢?答案是否定的——垃圾收集器会负责释放所有对象占据的内存,无论这些对象是如何创建的。它将对 finalize() 的需求限制到特殊的情况。在这种情况下,我们的对象可采用与创建对象时不同的方法分配一些存储空间。但大家或许会注意到,Java 中的所有东西都是对象,所以这到底是怎么一回事呢?
之所以要使用 finalize(),看起来似乎是由于有时需要采取与 Java 的普通方法不同的一种方法,通过分配内存来做一些具有 C 风格的事情。这主要可以通过“固有方法”来进行,它是从 Java 里调用非 Java 方法的一种方式(固有方法的问题在附录 A 讨论)。C 和 C++是目前唯一获得固有方法支持的语言。但由于它们能调用通过其他语言编写的子程序,所以能够有效地调用任何东西。在非 Java 代码内部,也许能调用 C 的 malloc() 系列函数,用它分配存储空间。而且除非调用了 free(),否则存储空间不会得到释放,从而造成内存“漏洞”的出现。当然,free() 是一个 C 和 C++函数,所以我们需要在 finalize() 内部的一个固有方法中调用它。
读完上述文字后,大家或许已弄清楚了自己不必过多地使用 finalize()。这个思想是正确的;它并不是进行普通清除工作的理想场所。那么,普通的清除工作应在何处进行呢?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论