您的位置:首页 > 编程语言 > Java开发

thinking in java test5.5练习(10)(11)(12)finalize()方法

2018-01-26 21:48 393 查看
原文地址: http://blog.csdn.net/qq_35396447/article/details/52411439

练习(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();

1

练习(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状态为满的,不满足清理条件。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: