Java中的finalize方法

一、介绍

当一个对象没有引用的时候,对象的垃圾回收器会调用finalize方法。

  • 当对象被回收时,系统自动调用该对象的finalize方法,子类可以重写该方法,做一些释放资源的操作。
  • 什么时候被回收:当某个对象没有任何引用时,jvm就认为这个对象是一个垃圾对象,就会使用垃圾回收机制来销毁该对象,在销毁对象前,会先调用finalize方法。
  • 垃圾回收机制的调用,是由系统来决定(有自己的GC算法),也可以通过System.gc()主动触发垃圾回收机制。

Tip:并不是说有一个垃圾对象,垃圾回收器就马上回收,它有一套自己的算法(在jvm中会讲)。

我们在实际开发中,几乎不会使用finalize方法(但是面试可能会用)

二、finalize例子

package object;

//演示finalize的用法
public class Finalize {
    public static void main(String[] args) {
        Car bmw = new Car("宝马");
        //这时bmw对象就是一个垃圾,垃圾回收器就会回收(销毁)对象(就是释放它的堆内存,可以腾出来给别的对象用),在销毁对象前,会调用该对象的finalize方法
        //程序员可以在finalize方法中,写自己的业务逻辑代码(比如释放资源: 数据库连接,or打开的文件...)
        //如果程序员不重写finalize方法,那么就会调用Object类的finalize方法,即默认处理(Object类的finalize方法是什么也不干的,即Object类只是提供了这样一个机制,但并没有做实事)
        //如果程序员重写finalize方法,就可以实现自己的逻辑
        bmw = null;
        System.gc(); //主动调用垃圾回收器
        System.out.println("程序退出了...");
    }
}

class Car{
    private String name;

    public Car(String name) {
        this.name = name;
    }

    //重写finalize方法
    @Override
    protected void finalize() throws Throwable {
        super.finalize();
        System.out.println("我们销毁汽车" + name);
        System.out.println("释放了某些资源...");
    }
}

输出结果如下:

程序退出了...

我们销毁汽车宝马

释放了某些资源...

在这里面,并不会出现System.gc();语句执行完之后,再向下执行的情况,而是会有一种多线程的情况,所以先输出了“程序退出了...”

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

m1m-FG

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值