thinking in java test5.5练习(10)(11)(12)finalize()方法
来源:互联网 发布:淘宝免费开店步骤 编辑:程序博客网 时间:2024/05/29 13:17
练习(10):编写具有finalize()方法的类,并在方法中打印消息。在main()中为该类创建一个对象。试解释这个程序的行为。
我们知道java有垃圾回收机制,垃圾回收机制会在必要的时刻回收内存。但是要注意的是,垃圾回收器只知道释放那些由new分配的内存。程序有时候会存在某些特殊的内存,不是由new获得的,此时垃圾回收器就无法对其清理。这时候finalize()方法就起作用了。
如果一个类中有finalize()方法,当垃圾回收器准备释放对象的内存时,会先调用finalize()方法,通过里面你写的代码进行一些工作,比如检查某些资源是否清理等等,然后在下一次垃圾回收器的回收动作时再回收对象。
代码:
public class test5_5_10 { public static void main(String[] args){ DownloadPicture down = new DownloadPicture(); down.closeInternet(); new DownloadPicture(); //由于真实情况很难碰到内存不够用,所以用该代码来强行中止程序动作, // 达到模拟垃圾回收器回收该对象的目的 System.gc(); }}class DownloadPicture{ boolean isClose = false; void closeInternet(){ isClose = true; } @Override protected void finalize() throws Throwable { super.finalize(); if (!isClose){//如果网络没有关闭,则发出警告 System.err.println("internet is not close"); } }}
这里是一个模拟下载类,我们知道下载需要连接网络,当下载完毕后需要关闭掉那些连接网络的资源,这个类里closeInternet()方法是用来关闭那些资源的。在main里我们可以看到,新new的一个对象没有关闭资源。这时如果我们没有重写finalize()方法,那么即使新new出来的对象被回收,这些资源也许会一直占用着。所以我们在finalize方法里做了检查工作。
练习(11):修改前一个练习的程序,让你的finalize()总会被调用。
上一个程序例子中我们模拟了网络链接的情况,但在真实链接中自然会有其它方法来关闭那些需要关闭的资源。因为在通常情况下我们不能指望finalize()。finalize()不是适合进行普通清理的方式。
这里题目出的有点问题,finalize()在垃圾回收器回收到相应对象时总会被调用,这里的总会被调用意思时在我们写的模拟代码中总会被调用,其实就是这句代码:
System.gc();
练习(12):编写名为Tank的类,此类的状态可以是“满的”或“空的”。其终结条件是:对象被清理时必须处于空状态。请编写finalize()以检验终结条件是否成立。在main()中测试Tank可能发生的几种使用方式。
public class test5_5_12 { public static void main(String[] args){ //默认为满的并且清理 Tank tank = new Tank("tank"); tank.clear(); //默认为满的且不清理// Tank tank1 = new Tank("tank1");这种写法System.gc()无法生效。 new Tank("tank1"); //默认为空且不清理 new Tank("tank2",false); //默认为空并且清理 Tank tank3 = new Tank("tank3",false); tank3.clear(); System.gc();//使达到垃圾回收状态 }}class Tank{ boolean empty ; String name; public Tank(String name){ this.name = name; empty = true;//默认为满的 } public Tank(String name,boolean isEmpty){//构造方法 this.name = name; empty = isEmpty; } void clear(){//使状态变成空 empty = false; } @Override protected void finalize() throws Throwable { super.finalize(); if (empty){ System.err.println("tank : " + name + " is empty"); } }}
输出结果是tank1状态为满的,不满足清理条件。
- thinking in java test5.5练习(10)(11)(12)finalize()方法
- thinking in java test5.1练习(1)(2)
- thinking in java test5.3练习(3)(4)(5)(6)(7)
- Thinking in Java(5)-finalize()和初始化
- thinking in java test5.8练习(16)(17)(18)
- 【Java】 Thinking in Java 2-11 练习10
- Thinking in JAVA 习题练习
- THINKING IN java(实例练习)
- java学习笔记--thinking in java(一)----finalize()函数
- Thinking in java-19 final、finally、finalize关键字
- 【Java】 Thinking in Java 4.8 练习10 吸血鬼数字
- thinking in java test4.5练习(6)(7)
- 【Java】 Thinking in Java 4.8 练习9
- thinking in java test3.11练习(11)(12)(13)
- Thinking in Java方法签名
- Thinking in Java 12
- Thinking in java-12
- Thinking in java-11
- Linux32位64位问题
- 项目应用:pojo与map的相互转换
- Spring+Mybatis实战教程
- java实现压缩指定文件夹(文件夹包含子文件夹或文件)为zip格式压缩包
- 滑动删除与cell中的点击事件冲突
- thinking in java test5.5练习(10)(11)(12)finalize()方法
- Kubernetes入门(三) - 网络
- spring的管理bean和依赖注入的原理剖析
- 计算机视觉和图像处理框架
- fragment中判断网络
- hdu1010Tempter of the Bone 搜索
- web前端总结一DOM性能优化
- 异或应用小总结
- iOS --判断设备是否为越狱设备,防止越狱设备进行iap内购