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

练习(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状态为满的,不满足清理条件。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值