JAVA语言之《TIJ4》初始化与清理 练习 E10-E12 练习使用finalize()
小标 2018-07-17 来源 : 阅读 824 评论 0

摘要:本文主要向大家介绍了JAVA语言之《TIJ4》初始化与清理 练习 E10-E12 练习使用finalize(),通过具体的内容向大家展示,希望对大家学习JAVA语言有所帮助。

本文主要向大家介绍了JAVA语言之《TIJ4》初始化与清理 练习 E10-E12 练习使用finalize(),通过具体的内容向大家展示,希望对大家学习JAVA语言有所帮助。

练习10:编写一个具有finalize()方法的类,并在方法中打印消息,在main()方法中为该类创建一个对象。

package initialization;

public class E10_FinalizeCall {

 

    protected void finalize(){

        System.out.println("finalize() called");

    }

 

    public static void main(String[] args) {

        new E10_FinalizeCall();

}

注意这里并没有声明对象的引用,只有这样,垃圾回收时才会回收这个对象。
该程序中的终结器不一定会被调用,因为程序通常并没有产生足够的垃圾供回收器回收。

练习11:修改上面的程序,使得finalize()方法总会被调用。

package initialization;

public class E10_FinalizeCall {

 

    protected void finalize(){

        System.out.println("finalize() called");

    }

 

    public static void main(String[] args) {

        new E10_FinalizeCall();

        System.gc();

        System.runFinalization();   

    }

}

这里增加了两行代码:

System.gc();System.runFinalization();

依次调用这两个方法会建议系统垃圾回收从而调用finalize(),但这不一定会发生。 调用这两个方法只会请求垃圾回收,它不能终结器一定会执行。
因此,无法保证finalize()方法总被调用。

练习12:编写Tank类,此类的状态可以是“满的”或“空的”, 其终结条件是:对象被清理时,必须处于空状态。编写finalize()以校验终结条件是否成立。在main()中测试Tank的几种使用方式。

package initialization;

public class Tank {

 

    static long counter;

    long id = counter++;

    boolean full;

 

    public Tank() {

        System.out.println(this + " created");

        full = true;

    }

 

    public void empty(){

        full = false;

    }

 

    protected void finalize(){

        if(full)

            System.out.println("Error: " + this + " must be empty at cleanup");

        else

            System.out.println(this + " cleaned up OK");

    }

 

    @Override

    public String toString() {

        return "Tank " + id;

    }

 

    public static void main(String[] args) {

        // 正确的使用和清理

        new Tank().empty();

        // 状态不为空时的清理

        new Tank();

        // 请求垃圾回收

        System.gc();

        System.runFinalization();

    }

}

这里我们创建了两个没有引用的Tank实例,因为如果我们创建了引用,那么在调用System.gc()时这些引用仍在作用域中,因此它们就不会被清理,终结器finalize()也就不会被调用。另一种方法是将引用置为null,这样也可以使引用原来指向的对象被回收。例如:

Tank tank = new Tank();

tank = null;

你永远也无法保证终结器一定会被调用,因此它们的功能就很受限。这里终结器可以用来在垃圾回收时,检测对象的状态,以确保对象可以正确得被清理。

本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注编程语言JAVA频道!

本文由 @小标 发布于职坐标。未经许可,禁止转载。
喜欢 | 1 不喜欢 | 0
看完这篇文章有何感觉?已经有1人表态,100%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程