Java基础面试题07:finalize() 方法什么时候被调用?析构函数(finalization)的目的是什么?

Java 提供了一个 finalize() 方法,允许在垃圾回收器将对象从内存中清除之前,对对象进行必要的清理工作。以下内容将对 finalize() 的调用时机、析构函数的目的以及 finalfinalize 的区别进行深入解析。


finalize() 方法

finalize() 是 Java 的一个特殊方法,它属于所有类的“祖宗”——Object 类,也就是说每个 Java 类都默认继承了这个方法。它的核心作用是:在垃圾回收器回收对象之前进行清理操作

finalize() 方法什么时候被调用?

  • 调用时机
    当垃圾回收器发现某个对象已经没有任何引用时,它会对该对象调用 finalize() 方法,进行必要的清理操作。

  • 调用过程

    1. 假设有一个对象 Dog,它占用了一块堆内存。对象的引用用变量 d 表示:

      Dog d = new Dog();
      
    2. 当我们将 d 赋值为 null 时:

      d = null;
      

      这意味着程序中已经没有任何地方可以访问到这个 Dog 对象,它变成了“无主对象”。

    3. 此时,垃圾回收器会将这个对象标记为“可回收”。在实际回收之前,垃圾回收器会自动调用对象的 finalize() 方法。

  • 注意:垃圾回收器并不会立即回收对象,也就是说,赋值为 null 并不等于立刻触发 finalize()。垃圾回收的时间是由 JVM 决定的。


析构函数(finalization) 的目的

析构函数的主要目标是:在对象被销毁之前完成清理工作。这种清理可能包括:

  • 释放资源:比如关闭文件流、数据库连接等。
  • 释放内存:回收程序中动态分配的资源,减少内存泄漏的风险。

举例说明:垃圾回收的过程

让我们看看一个例子来感受 finalize() 的执行:

public class Dog {@Overrideprotected void finalize() throws Throwable {System.out.println("Dog对象即将被垃圾回收!");}
}public class Main {public static void main(String[] args) {Dog d = new Dog();d = null; // 去掉引用System.gc(); // 手动触发垃圾回收System.out.println("垃圾回收器已经被调用。");}
}

运行结果

  1. 调用 System.gc() 后,垃圾回收器被唤醒。
  2. 输出内容:
    垃圾回收器已经被调用。
    Dog对象即将被垃圾回收!
    

这说明垃圾回收器触发了 finalize() 方法,但程序不会等待 finalize() 执行完成后才继续。


final 和 finalize 的区别

两者名字相似,但功能完全不同:

  • final

    1. 修饰类:类不能被继承。
    2. 修饰方法:方法不能被重写。
    3. 修饰变量:变量一旦赋值,不能再改变。
  • finalize
    这是一个方法,用于对象销毁前的资源释放。可以通过重写 finalize() 方法,定义对象被回收时的自定义逻辑。


常见问题解析

Q1:为什么 finalize() 默认没有代码?

Object 类中的 finalize() 方法默认是空实现,因为不是所有对象都需要自定义销毁逻辑。

Q2:为什么手动调用垃圾回收器才看到 finalize() 调用?

垃圾回收器的执行时机由 JVM 决定,System.gc() 只是一种“建议”垃圾回收器运行的方法,并不能保证立即回收对象。

Q3:实际开发中是否经常用 finalize()

很少finalize() 更像是垃圾回收机制的补充,而不是主流解决方案。现代开发中,通常使用更可靠的工具如 try-with-resources 或手动释放资源代替。


总结

  1. finalize() 的作用:清理即将被销毁的对象,释放资源。
  2. 调用时机:当垃圾回收器发现对象无引用且准备回收时。
  3. finalfinalize 的区别:前者用于修饰类、方法和变量,后者是对象销毁前的“善后”方法。
  4. 开发建议:除非有明确需求,否则尽量避免重写 finalize() 方法,优先考虑更现代的资源管理方式。

用一句话记住:finalize() 是对象离开堆内存的告别礼,但不是每次离别都需要繁琐的仪式!

最后说一句(求关注,求赞,别白嫖我)

最近无意间获得一份阿里大佬写的刷题笔记,一下子打通了我的任督二脉,进大厂原来没那么难。
这是大佬写的
7701页的BAT大佬写的刷题笔记,让我offer拿到手软

本文,已收录于,我的技术网站 cxykk.com:程序员编程资料站,有大厂完整面经,工作技术,架构师成长之路,等经验分享

求一键三连:点赞、分享、收藏

点赞对我真的非常重要!在线求赞,加个关注我会非常感激!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/480109.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java 基础面试 题(Java Basic Interview Questions)

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 本人主要分享计算机核心技…

人工智能与传统控制系统的融合发展

在这个科技快速迭代的时代,人工智能技术正以前所未有的速度改变着我们的生活。在控制系统领域,AI技术的引入为传统控制带来了新的发展机遇和挑战。然而,这并不意味着传统控制将被完全取代,相反,AI与传统控制的深度融合…

Linux服务器安装mongodb

因为项目需要做评论功能,领导要求使用mongodb,所以趁机多学习一下。 在服务器我们使用docker安装mongodb 1、拉取mongodb镜像 docker pull mongo (默认拉取最新的镜像) 如果你想指定版本可以这样 docker pull mongo:4.4&#…

Qml-TabBar类使用

Qml-TabBar类使用 TabBar的概述 TabBar继承于Container 由TabButton进行填充,可以与提供currentIndex属性的任何容器或布局控件一起使用,如StackLayout 或 SwipeView;contentHeight : real:TabBar的内容高度,用于计算标签栏的隐…

Vue3的通灵之术Teleport

前言 近期Vue3更新了一些新的内容&#xff0c;我都还没有一个一个仔细去看&#xff0c;但是还是有必要去解读一下新内容的。就先从Teleport 开始吧。 官方对 Teleport 的解释是&#xff1a;<Teleport> 是一个内置组件&#xff0c;它可以将一个组件内部的一部分模板“传…

uniapp echarts tooltip formation 不识别html

需求&#xff1a; echarts 的tooltip 的域名太长&#xff0c;导致超出屏幕 想要让他换行 思路一&#xff1a; 用formation自定义样式实现换行 但是&#xff1a; uniapp 生成微信小程序&#xff0c; echart种的tooltip 的formation 识别不了html &#xff0c;自定义样式没办…

idea2024加载flowable6.8.1.36遇到的问题-idea启动flowable问题flowable源码启动问题

代码下载地址&#xff1a; https://gitee.com/hanpenghu_admin_admin/flowable6.8.1.git 1.首先是通过顶层目录maven clean install 发现很多子模块并不会install本地mavenStore库&#xff0c;这导致了&#xff0c;一堆相互依赖的模块报错找不到&#xff0c;所以需要根据报错…

DICOM医学影像应用篇——伪彩色映射 在DICOM医学影像中的应用详解

目录 引言 伪彩色映射的概念 基本原理 查找表&#xff08;Look-Up Table, LUT&#xff09; 步骤 示例映射方案 实现伪彩色映射的C代码 代码详解 伪彩色处理效果展示 总结 扩展知识 LUT 的基本概念 LUT 在伪彩色映射中的应用 示例 引言 在医学影像处理中&#xff0c…

【JavaEE 初阶】⽹络原理 - 初识

一、⽹络发展史 单机时代》局域网时代》广域网时代》移动互联网时代 1.独⽴模式 独⽴模式&#xff1a;计算机之间相互独⽴ 2.⽹络互连 随着时代的发展&#xff0c;越来越需要计算机之间互相通信&#xff0c;共享软件和数据&#xff0c;即以多个计算机协同⼯作来完成业务&am…

【工具】JS解析XML并且转为json对象

【工具】JS解析XML并且转为json对象 <?xml version1.0 encodingGB2312?> <root><head><transcode>hhhhhhh</transcode></head><body><param>ccccccc</param><param>aaaaaaa</param><param>qqqq<…

vue3+vite使用vite-plugin-electron-renderer插件和script-loader插件有冲突

报错信息&#xff1a;Error: Dynamic require of "path" is not supported 报错问题是在使用vite-plugin-electron-renderer插件不支持import动态引入&#xff0c;该报错信息并不准确&#xff0c;实际原因是vite-plugin-electron-renderer插件和script-loader插件有…

电子应用设计方案-28:智能云饭锅系统方案设计

智能云饭锅系统方案设计 一、系统概述 本智能云饭锅系统旨在为用户提供便捷、智能、个性化的烹饪体验&#xff0c;通过云技术实现远程控制、食谱分享、智能烹饪等功能。 二、系统组成 1. 饭锅主体 - 内胆&#xff1a;采用优质不粘涂层&#xff0c;具有良好的导热性和耐用性。 -…

OminiControl:一个新的FLUX通用控制模型,单个模型实现图像主题控制和深度控制

之前的文章中和大家介绍过Flux团队开源了一系列工具套件&#xff0c;感兴趣的小伙伴可以点击下面链接阅读~ AI图像编辑重大升级&#xff01;FLUX.1 Tools发布&#xff0c;为创作者提供了更强大的控制能力。 OminiControl 也开源了其可控生成模型。OminiControl 是一个最小但功…

小程序 - 本地生活

小程序页面和样式练习 - 本地生活小程序开发笔记 目录 本地生活 准备工作 加载图片素材 页面开发 页面样式开发 功能实现截图 总结 本地生活 本地生活”微信小程序是一个介绍本地美食、装修、工作等信息的微信小程序&#xff0c;该微信小程序的首页包含轮播图区域和九宫…

常见的Web安全漏洞——XSS

概念 跨站脚本攻击(XSS&#xff09;&#xff0c;指攻击者通过篡改网页&#xff0c;嵌入恶意脚本程序&#xff0c;在用户浏览网页时&#xff0c;控制用户浏览器进行恶意操作。 XXS的分类 反射型XSS存储型XSSDOM型XSS 原理 反射型XSS 接收用户提交的访问者的姓名&#xff0…

deepin 安装 chrome 浏览器

deepin 安装 chrome 浏览器 最近好多小伙伴儿和我说 deepin 无法安装最新的谷歌浏览器 其实是因为最新的 谷歌浏览器 其中的一个依赖需要提前安装 提前安装依赖然后再安装谷歌浏览器就可以了 安装 fonts-liberationsudo apt -y install fonts-liberation安装 chrome 浏览器sudo…

洛谷 P2385 [USACO07FEB] Bronze Lilypad Pond B C语言 bfs

题目&#xff1a; https://www.luogu.com.cn/problem/P2385 题目看仔细&#xff0c;是M行N列.八个方向数组依靠M1,M2&#xff0c;所以初始化方向数组要在主函数里面&#xff0c;传入bfs函数里。 #include <iostream> #include<algorithm> #include<queue>…

【61-70期】Java面试题深度解析:从集合框架到线程安全的最佳实践

&#x1f680; 作者 &#xff1a;“码上有前” &#x1f680; 文章简介 &#xff1a;Java &#x1f680; 欢迎小伙伴们 点赞&#x1f44d;、收藏⭐、留言&#x1f4ac; 文章题目&#xff1a;Java面试题深度解析&#xff1a;从集合框架到线程安全的最佳实践 摘要&#xff1a; 本…

简释下oracle的set define的使用场景

我们在使用oracle的时候&#xff0c;有些菜单表存在url字段&#xff0c;url字段中存在这&字符。但我们通过sql语句进行插入表记录的时候&#xff0c;数据库会提示要我们输入变量值。这个时候有些人难免会不知所措&#xff0c;今天告诉大家一个非常简单的办法解决。 一、问…

六大排序算法:插入排序、希尔排序、选择排序、冒泡排序、堆排序、快速排序

本章讲述数据结构中的六大排序算法 欢迎大佬们踊跃讨论&#xff0c;感谢大家支持&#xff01; 我的博客主页链接 六大排序算法 一.插入排序1.1 直接插入排序1.2 希尔排序 二.选择排序2.1 单向选择排序2.2双向选择排序2.3 堆排序 三.交换排序3.1 冒泡排序3.2 快速排序3.2.1 Hoa…