每天进步一丢丢,连接梦与想

如果你停止就是谷底,如果你还在努力就是上坡

系列文章

java”小心机”(1)【资源彩蛋!】

java小心机(2)| 重载和构造器的小细节

  • 预备知识

    JNI(Java Native Interface),它提供了若干的API实现了Java和其他语言的通信(主要是C&C++)

  • 概念

    finalize()是Object类中的一个方法,垃圾回收器准备释放对象占用的内存时,首先调用它的finalize()方法。

  • finalize()是否等同于C++中的析构函数?

    答案是否定的。

    析构函数:在C++中没有垃圾回收器,当对象需要被销毁时,需要手动调用delete()方法释放内存,而析构函数会在内存释放前被调用,用于释放对象使用的资源,比如在其中经常做一些文件保存之类的收尾工作。对象一定会被销毁。

    finalize():会在垃圾回收器准备释放对象内存时被调用,但垃圾回收并不一定发生,只有在濒临内存溢出时才会被调用;若内存一直充足,则永远不会被调用。如果这个程序结束了,垃圾回收器一直没有释放掉你创建的任何对象的存储空间,则随着程序的退出,那些资源也会全部交还给操作系统。

    finalize()并不会确保对象会被销毁,所以它不是析构函数。

  • 作用

    1.释放那些不是通过new分配的内存

    在JNI技术中,可能会通过C语言的malloc()分配内存,这部分内存无法通过垃圾回收器释放,只能通过在finalize()中调用本地方法释放。

    2.用于检验终结条件(判断对象在清理时是否安全释放)

    下面看个用于检验终结条件的例子:

public class Book {
public boolean checkedOut = false; public Book(boolean checkedOut) {
this.checkedOut = checkedOut;
} public void checkIn() {
checkedOut = false;
} //重写finalize方法 \
@Override
protected void finalize() throws Throwable {
//校验checkedOut
if (checkedOut) {
System.out.println("校验出现了一次错误: Checked out ");
}
super.finalize();
}
}
public class TerminationCondition {
public static void main(String[] args) { Book novel = new Book(true);
novel.checkIn(); //对checked进行了一次误操作,未进行签入
new Book(true); //调用Gc 强制执行终结操作(finalize)
System.gc();
}
}

本例的终结条件是:所有的Book对象在被当作垃圾回收前都应该被签入(check in)。

在main()方法中可看到,一次误操作未对Book对象进行签入,导致有一本书没有被签入。此时我们可以使用finalize()验证终结条件。

热门阅读:

**【推荐两款神器】不限速下载、追剧神器

**实用代码|javaMail发送邮件(文末重磅资源!)

限时领取| 热门编程语言学习资源,不收藏吗?

java面试系列文章:

java面试| 精选基础题(1)

java面试| 精选基础题(2)

java面试| 精选基础题(3)

阅读原文可查看更多精彩内容…**

end~thanks!

一个立志成大腿而每天努力奋斗的年轻人

伴学习伴成长,成长之路你并不孤单!

                                             如果觉得文章不错,请点个赞、分享给你的朋友呗!

最新文章

  1. 解读sencha touch移动框架的核心架构(一)
  2. 数据库 定义 bit 类型 (true=1,false=0)
  3. echarts一个页面动态加载两张不同图表数据
  4. Oracle 客户端连接服务器[转]
  5. HiveQ与传统SQL差异
  6. Debug.print的用法
  7. VS预生成事件命令行 和 生成后事件命令行
  8. WPF之UseLayoutRounding和SnapsToDevicePixels
  9. [jobdu]数组中的逆序对
  10. C#总结项目《影院售票系统》编写总结二
  11. python多线程实现售票
  12. EasyUI - Tree 树组件
  13. 部署 Prometheus Operator - 每天5分钟玩转 Docker 容器技术(179)
  14. python安装media报错
  15. Noj - 在线强化训练2
  16. jenkins Pipeline 使用
  17. 自然语言交流系统 phxnet团队 创新实训 项目博客 (十一)
  18. ASP.NET MVC Castle Windsor 教程
  19. [ACM_模拟] UVA 12503 Robot Instructions [指令控制坐标轴上机器人移动 水]
  20. python中高阶函数与装饰器

热门文章

  1. IdentityServer4 Resources
  2. codeforces 540E 离散化技巧+线段树/树状数组求逆序对
  3. python文件的读写追加等操作
  4. Python 序列求和
  5. Python之eval和exec
  6. 使用 postman 给 API 写测试
  7. .Net快速上手Nlog日志组件
  8. DRF 06
  9. $loj\ 6045$ [雅礼集训 $2017\ Day8$] 价 网络流
  10. $Poj2376\ Poj3171\ Luogu4644\ Cleaning\ Shifts$ 数据结构优化$DP$