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();语句执行完之后,再向下执行的情况,而是会有一种多线程的情况,所以先输出了“程序退出了...”

  • 6
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
### 回答1: Javafinalize方法是一个特殊的方法,它在对象被垃圾回收之前被调用。它的作用是在对象被销毁之前,执行一些必要的清理工作,例如关闭文件、释放资源等。finalize方法Java的一种保护机制,它确保在对象被销毁之前,所有必要的清理工作都已经完成。但是,由于finalize方法的执行时间不确定,因此它不应该被用于释放重要的系统资源。 ### 回答2: Javafinalize()方法是一种特殊的方法,用于垃圾回收。它是由Java虚拟机(JVM)在对象从内存被回收之前自动调用的一个方法finalize()方法允许对象在被销毁之前执行任何清理操作,并在垃圾回收过程释放资源。 finalize()方法的主要作用是在JVM对对象进行垃圾回收之前,让对象有机会执行释放资源、关闭文件、释放锁、解除连接等必要操作。这种方法可以在需要处理敏感信息、释放系统资源、关闭服务或清理状态等情况下创建,并能确保语句块的执行。 虽然finalize()方法Java的保留方法之一,但它已经被证明不是特别可靠,不应该完全依赖它来释放系统资源。这是因为finalize()方法的工作机制不完全可预知,它的调用时机取决于JVM的垃圾回收策略,而不是程序员的控制。 因此,通常建议使用try-finally语句块来确保及时释放资源,而不是依赖finalize()方法。此外,由于finalize()的使用可能会导致程序的不可预测行为,因此JDK 9以后这个方法已经不推荐使用了。 总之,Javafinalize()方法的作用是允许程序员在对象即将从内存删除之前执行某些操作,以便释放系统资源或清理状态。但程序员不应该完全依赖它来释放系统资源,而应该使用其他更可靠的机制来确保及时释放资源。 ### 回答3: Javafinalize()方法是在对象销毁时被调用的方法,它允许我们进行一些清理工作和资源释放,以使程序运行更为高效。finalize()方法的作用可以分为两个方面:对象的清理和对象的销毁。 首先,finalize()方法可以在对象被GC垃圾回收器清理时被自动调用,它可以用于执行一些清理任务,例如关闭文件、释放内存等。在Java,内存管理一般都是由垃圾回收器来完成的,但是在某些情况下,程序员需要进行一些手动的内存管理操作,此时可以通过finalize()方法来实现。 其次,finalize()方法可以有效地防止资源泄漏。当程序运行时,如果对象不再被使用,但是没有正确地释放对象所占用的资源,就会造成资源泄漏。而使用finalize()方法可以在对象销毁时释放对象所占用的资源,避免资源泄漏的发生。 需要注意的是,虽然finalize()方法可以在对象被垃圾回收时释放资源,但是它并不是在对象销毁时被调用的。因为Java的垃圾回收机制是非确定性的,所以finalize()方法并不能保证被及时地执行。因此,即便是使用了finalize()方法,也应该在程序手动释放资源来确保程序的正确性和稳定性。 总之,finalize()方法Java扮演着非常重要的角色,它可以在对象被清理或销毁时执行一些必要的操作,对于Java程序的正确性和高效性都有着非常重要的影响。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

m1m-FG

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

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

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

打赏作者

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

抵扣说明:

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

余额充值