java finalize 作用_java中的finalize方法有什么作用「建议收藏」

java finalize 作用_java中的finalize方法有什么作用「建议收藏」java中的finalize方法是Object类中提供的一个方法,在GC准备释放对象所占用的内存空间之前,它将首先调用finalize()方法。finalize()方法是Object类中提供的一个方法,在GC准备释放对象所占用的内存空间之前,它将首先调用finalize()方法。其在Object中定义如下:protectedvoidfinalize()throwsThrowable{}…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

java中的finalize方法是Object类中提供的一个方法,在GC准备释放对象所占用的内存空间之前,它将首先调用finalize()方法。

69be7c17fd4c017d9378e6d1efdd61c9.png

finalize()方法是Object类中提供的一个方法,在GC准备释放对象所占用的内存空间之前,它将首先调用finalize()方法。其在Object中定义如下:protected void finalize() throws Throwable { }

1 finalize()调用的时机

与C++的析构函数(对象在清除之前析构函数会被调用)不同,在Java中,由于GC的自动回收机制,因而并不能保证finalize方法会被及时地执行(垃圾对象的回收时机具有不确定性),也不能保证它们会被执行(程序由始至终都未触发垃圾回收)。public class Finalizer {

@Override

protected void finalize() throws Throwable {

System.out.println(“Finalizer–>finalize()”);

}

public static void main(String[] args) {

Finalizer f = new Finalizer();

f = null;

}

}

//无输出public class Finalizer {

@Override

protected void finalize() throws Throwable {

System.out.println(“Finalizer–>finalize()”);

}

public static void main(String[] args) {

Finalizer f = new Finalizer();

f = null;

System.gc();//手动请求gc

}

}

//输出 Finalizer–>finalize()

2 什么时候应该使用它

finalize()方法中一般用于释放非资源(如打开的文件资源、数据库连接等),或是调用非Java方法(native方法)时分配的内存(比如C语言的malloc()系列函数)。

3 为什么应该避免使用它

首先,由于finalize()方法的调用时机具有不确定性,从一个对象变得不可到达开始,到finalize()方法被执行,所花费的时间这段时间是任意长的。我们并不能依赖finalize()方法能及时的回收占用的资源,可能出现的情况是在我们耗尽资源之前,gc却仍未触发,因而通常的做法是提供显示的close()方法供客户端手动调用。

另外,重写finalize()方法意味着延长了回收对象时需要进行更多的操作,从而延长了对象回收的时间。

4 让对象再活一次

利用finalize()方法最多只会被调用一次的特性,我们可以实现延长对象的生命周期。class User{

public static User user = null;

@Override

protected void finalize() throws Throwable {

System.out.println(“User–>finalize()”);

user = this;

}

}

public class FinalizerTest {

public static void main(String[] args) throws InterruptedException {

User user = new User();

user = null;

System.gc();

Thread.sleep(1000);

user = User.user;

System.out.println(user != null);//true

user = null;

System.gc();

Thread.sleep(1000);

System.out.println(user != null);//false

}

}

推荐教程: 《java教程》

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/191900.html原文链接:https://javaforall.net

(0)
上一篇 2026年1月23日 上午9:22
下一篇 2026年1月23日 上午10:01


相关推荐

  • Idea激活码最新教程2020.2.4版本,永久有效激活码,亲测可用,记得收藏

    Idea激活码最新教程2020.2.4版本,永久有效激活码,亲测可用,记得收藏Idea 激活码教程永久有效 2020 2 4 激活码教程 Windows 版永久激活 持续更新 Idea 激活码 2020 2 4 成功激活

    2025年5月22日
    5
  • unity中使用豆包火山引擎实现语音转文字技术

    unity中使用豆包火山引擎实现语音转文字技术

    2026年3月12日
    1
  • vrrp协议的作用是实现什么的备份_vrrp优先级越大越优先吗

    vrrp协议的作用是实现什么的备份_vrrp优先级越大越优先吗一、VRRP的工作原理。二、VRRP的基本配置。三、VRRP的典型组网模型及并掌握配置方法。四、VRRP的常见问题及解决办法。一、VRRP的工作原理VRRP概述VirtualRouterRedundancyProtocol,也即虚拟路由器冗余协议。利用VRRP,一组路由器协同工作,但只有一个处于Master状态,处于该状态的路由器承担实际的数据流量转发任务。在一个VRRP组内的多个路由器接口共用一个虚拟IP地址,该地址被作为局域网内所有主机的缺省网关地址。VRRP决定哪个路由器是Ma

    2025年5月23日
    4
  • 常用的录屏软件_windows10录屏

    常用的录屏软件_windows10录屏什么录屏软件既免费又好用?要用到录屏软件的原因有很多,比如需要:制作产品展示视频、提供技术支持或使用视频通话,但使用电脑的系统录屏软件,可不足以录制高质量的视频。无论你想截取整个屏幕或者部分屏幕,通过高质量的录屏软件都可以实现。关于录屏软件屏幕记录软件可以录制电脑或移动设备的屏幕,包括鼠标点击以及触屏的动作都能被记录下来,还能录制音频。世界上没有两个完全相同的录屏工具。因此,在设备上下载或安装录屏…

    2026年3月3日
    9
  • C语言中函数指针和回调函数的详解「建议收藏」

    C语言中函数指针和回调函数的详解「建议收藏」函数指针:指向函数的指针变量。因此“函数指针”本身首先应是指针变量,只不过该指针变量指向函数。这正如用指针变量可指向整型变量、字符型、数组一样,这里是指向函数。如前所述,C在编译时,每一个函数都有一个入口地址,该入口地址就是函数指针所指向的地址。有了指向函数的指针变量后,可用该指针变量调用函数,就如同用指针变量可引用其他类型变量一样,在这些概念上是大体一致的。函数指针有两个用途:调用函数和做函数…

    2022年6月22日
    31
  • 干货 | LIDAR、ToF相机、双目相机如何科学选择?「建议收藏」

    干货 | LIDAR、ToF相机、双目相机如何科学选择?「建议收藏」点击“计算机视觉life”关注,置顶更快接收消息!本文阅读时间约5分钟本文翻译自卡内基梅隆大学Chrisasteroid三维视觉技术的选择传感器参数及定义LIDAR&ToF相机&双目相机介绍工作原理优缺点采样数据比较测试及极端情况测试三维成像技术原理和应用想必大家在之前的文章中了解过啦,今天想给大家比较一下LIDAR、ToF相机…

    2022年5月26日
    57

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号