Java 面试题:谈谈 final、finally、 finalize 有什么不同?
在 Java 编程中,
final、finally和finalize是三个看似相似但用途截然不同的关键字和方法。理解它们的区别对于编写高质量和健壮的代码至关重要。
final关键字可用于声明常量、方法和类。用在变量上表示变量不可变,用在方法上表示方法不能被重写,用在类上表示类不能被继承。它在确保程序稳定性和安全性方面起着重要作用。
finally是异常处理机制的一部分,用于定义在try和catch块执行后必须执行的代码。无论是否发生异常,finally块中的代码都会被执行,用于清理资源等操作,确保程序能够正确地释放资源。
finalize是Object类中的一个方法,用于对象被垃圾回收器回收之前的清理工作。尽管finalize方法在理论上可以用于资源回收,但由于其不确定性和性能问题,在实际编程中很少被使用。通过探讨这些关键字和方法的区别,可以帮助你更深入地理解 Java 的内存管理和异常处理机制,从而编写出更健壮和高效的代码。
文章目录
- 1、面试问题
- 2、问题分析
- 3、典型回答
- 4、问题深入
- 4.1、解释final在类、方法和变量中的具体作用和意义
- 4.2、讨论finally块的执行时机和特例情况
- 4.3、解释finalize方法的工作原理和为什么不推荐使用
- 4.4、讨论使用final关键字的最佳实践
- 4.5、讨论try-with-resources语句及其优势
- 4.6、讨论Java 9引入的Cleaner机制
1、面试问题
今天的面试问题:谈谈final、finally、finalize有什么不同?
2、问题分析
这个问题主要考察以下几个关键点:
- 语法和定义:了解
final、finally、finalize的基本定义和用法。 - 应用场景:掌握它们在实际编程中的应用场景。
- 设计目的:理解它们设计的目的和使用中的注意事项。
- 性能和最佳实践:了解它们在性能和最佳实践方面的影响和推荐使用方式。
这个问题不仅考察基础知识,还涉及Java编程的语法、内存管理和异常处理机制,是评估Java开发者技能的一个重要方面。
3、典型回答
final:
-
定义:
final关键字可以用来修饰类、方法和变量。 -
用法:
-
修饰类:表示该类不能被继承。
public final class FinalClass {// Class implementation } -
修饰方法:表示该方法不能被重写。
public class ParentClass {public final void finalMethod() {// Method implementation} } -
修饰变量:表示该变量的值不能被修改。
public class Example {public static final int CONSTANT = 10; }
-
-
应用场景:用于明确不可修改的类、方法和变量,提供更好的代码安全性和可读性。
finally:
-
定义:
finally块用于保证无论是否抛出异常,都必须执行特定代码。 -
用法:
try {// Code that may throw an exception } catch (Exception e) {// Exception handling code } finally {// Code that will always be executed } -
应用场景:用于资源释放,如关闭文件流、数据库连接等,确保资源不泄露。
finalize:
-
定义:
finalize方法是java.lang.Object类的一个方法,用于在对象被垃圾收集前进行清理操作。 -
用法:
@Override protected void finalize() throws Throwable {try {// Cleanup code} finally {super.finalize();} } -
应用场景:用于清理资源,但不推荐使用。
finalize机制在JDK 9中被标记为deprecated,建议使用其他方式进行资源管理,如try-with-resources或Cleaner机制。
4、问题深入
如果继续深入,面试官可以从各种不同的角度考察,比如可以:
4.1、解释final在类、方法和变量中的具体作用和意义
final 修饰类
- 作用:表示该类不能被继承,防止类的继承和扩展。
- 意义:确保类的设计不被改变,特别是对于工具类和不可变类(immutable class)。
- 示例:
public final class UtilityClass {public static void utilityMethod() {// Utility method implementation}
}
- 应用场景:用于创建工具类或不可变类,防止类被继承和修改。
final 修饰方法:
- 作用:表示该方法不能被重写(override)。
- 意义:确保关键方法的行为不被子类修改,维护方法的逻辑一致性。
- 示例:
public class ParentClass {public final void criticalMethod() {// Critical method implementation}
}public class ChildClass extends ParentClass {// 不能重写criticalMethod
}
- 应用场景:用于保护类中的关键方法,防止子类修改其行为。
final 修饰变量:
- 作用:表示该变量的值一旦初始化后就不能被修改。
- 意义:确保变量的值不可变,增加代码的安全性和可读性。
- 示例:
public class Constants {public static final int MAX_SIZE = 100;private final int id;public Constants(int id) {this.id = id;}
}
- 应用场景:用于定义常量,确保变量在初始化后不被修改。
4.2、讨论finally块的执行时机和特例情况
finally块的执行时机
- 正常情况下:在try块或catch块执行结束后,finally块中的代码一定会被执行。
- 异常情况下:即使try块或catch块中抛出了异常,finally块中的代码仍然会被执行。
示例:
try {// Code that may throw an exception
} catch (Exception e) {// Exception handling code
} finally {// Code that will always be executed
}
特例情况
- System.exit():如果在try块或catch块中调用了
System.exit()方法,finally块中的代码不会被执行。 - 虚拟机崩溃:如果JVM崩溃,finally块中的代码也不会被执行。
示例:
try {System.exit(0); // JVM退出,finally块不会执行
} finally {System.out.println("This will not be printed");
}
4.3、解释finalize方法的工作原理和为什么不推荐使用
finalize方法的工作原理
- 定义:
finalize是java.lang.Object类的一个方法,用于在对象被垃圾收集前进行资源清理。 - 调用时机:垃圾收集器在回收对象前调用
finalize方法,但调用时间不确定。 - 实现方式:可以在类中覆盖
finalize方法来实现自定义的资源清理逻辑。
示例:
public class Resource {@Overrideprotected void finalize() throws Throwable {try {// Cleanup code} finally {super.finalize();}}
}
不推荐使用原因
- 不确定性:无法保证
finalize方法的执行时间,可能导致资源长时间未被释放。 - 性能问题:增加垃圾收集器的负担,影响性能。
- 替代方案:建议使用
try-with-resources或Cleaner机制进行资源管理。
4.4、讨论使用final关键字的最佳实践
修饰类
- 最佳实践:用于创建工具类或不可变类,防止类被继承和修改。
- 示例:
public final class UtilityClass {// Utility methods
}
修饰方法
- 最佳实践:用于保护类中的关键方法,防止子类修改其行为。
- 示例:
public class ParentClass {public final void criticalMethod() {// Critical code}
}
修饰变量
- 最佳实践:用于定义常量,确保变量在初始化后不被修改,增加代码的安全性和可读性。
- 示例:
public class Constants {public static final int MAX_SIZE = 100;private final int id;public Constants(int id) {this.id = id;}
}
4.5、讨论try-with-resources语句及其优势
定义
- 定义:
try-with-resources是Java 7引入的一种资源管理方式,自动关闭实现AutoCloseable接口的资源。 - 语法:在try块中声明的资源会在try块结束后自动关闭。
示例:
try (BufferedReader br = new BufferedReader(new FileReader("file.txt"))) {// Read file
} catch (IOException e) {// Handle exception
}
优势
- 简化代码:减少显式关闭资源的代码。
- 自动关闭:自动关闭资源,防止资源泄露。
- 处理异常:更好地处理异常,简化异常处理逻辑。
4.6、讨论Java 9引入的Cleaner机制
定义
- 定义:Cleaner是Java 9引入的一种资源清理机制,提供比
finalize更安全和高效的资源管理方式。 - 工作原理:使用
Cleaner类来注册对象和清理操作,垃圾收集器在对象被回收时执行清理操作。
示例:
Cleaner cleaner = Cleaner.create();class Resource implements Runnable {@Overridepublic void run() {// Cleanup code}
}Resource resource = new Resource();
cleaner.register(object, resource);
优势
- 确定性:Cleaner的执行时间更加确定。
- 性能:减少GC的开销,提高性能。
- 简单易用:提供更简单的API,方便资源管理。
通过这些详细的解答,面试官可以评估候选人对Java中final、finally、finalize的理解深度,以及他们在实际开发中应用这些知识的能力。
相关文章:
Java 面试题:谈谈 final、finally、 finalize 有什么不同?
在 Java 编程中,final、finally 和 finalize 是三个看似相似但用途截然不同的关键字和方法。理解它们的区别对于编写高质量和健壮的代码至关重要。 final 关键字可用于声明常量、方法和类。用在变量上表示变量不可变,用在方法上表示方法不能被重写&#…...
45、基于深度学习的螃蟹性别分类(matlab)
1、基于深度学习的螃蟹性别分类原理及流程 基于深度学习的螃蟹性别分类原理是利用深度学习模型对螃蟹的图像进行训练和识别,从而实现对螃蟹性别的自动分类。整个流程可以分为数据准备、模型构建、模型训练和性别分类四个步骤。 数据准备: 首先需要收集包…...
mongodb嵌套聚合
db.order.aggregate([{$match: {// 下单时间"createTime": {$gte: ISODate("2024-05-01T00:00:00Z"),$lte: ISODate("2024-05-31T23:59:59Z")}// 商品名称,"goods.productName": /美国皓齿/,//订单状态 2:待发货 3:已发货 4:交易成功…...
在 KubeSphere 上快速安装和使用 KDP 云原生数据平台
作者简介:金津,智领云高级研发经理,华中科技大学计算机系硕士。加入智领云 8 余年,长期从事云原生、容器化编排领域研发工作,主导了智领云自研的 BDOS 应用云平台、云原生大数据平台 KDP 等产品的开发,并在…...
Dev Eco Studio设置中文界面
Settings-Plugins-installed-搜索Chinese...
vscode作为markdown LaTeX编辑器
1、安装插件 Markdown All in One 2、下载并安装 prince:Prince - Latest builds Deepin 20.9 对应 debian 10,下载 debian 10 的deb包安装即可 (安装后命令在 /usr/bin 下) 3、安装插件 Markdown Preview Enhancedÿ…...
Java中的图形用户界面开发
Java中的图形用户界面开发 大家好,我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿! 在当今软件开发的世界中,图形用户界面(Graphical User Inte…...
android常用知识
透明activity样式: android:theme"android:style/Theme.Translucent.NoTitleBar.Fullscreen"这句代码,当你是建的empty activity project时,默认继承的是AppCompat这个类。所以在AndroidMifext.xml文件中用上述代码会导致程序错误&…...
centos中安装并设置vsftpd
vsftpd是一个可安装在linux上的ftp服务器软件。 一、安装 安装前保证服务器能上互联网。如果不能上网,看看能不能设法利用局域网代理上网。 sudo yum -y install vsftpd二、配置 1、修改配置文件 cd /etc/vsftpd #修改之前记得备份!!&am…...
C语言入门系列:指针入门(超详细)
文章目录 一,什么是指针1,内存2,指针是什么? 二,指针的声明1,声明指针类型变量2,二级指针 三,指针的计算1,两个指针运算符1.1 *运算符1.2 & 运算符1.3 &运算符与…...
打印水仙花数
题目:打印出所有的“水仙花数”,所谓“水仙花数”是指一个三位数,其各位数字立方和等于该数本身。 例如:153是一个“水仙花数”,因为153 1的三次方 +5的三次方+3的三次方。 程序分析ÿ…...
【SCAU数据挖掘】数据挖掘期末总复习题库简答题及解析——下
1.从某超市顾客中随机抽取5名,他们的购物篮数据的二元0/1表示如下: 顾客号 面包 牛奶 尿布 啤酒 鸡蛋 可乐 1 1 1 0 0 0 0 2 1 0 1 1 1 0 3 0 1 1 1 0 1 4 1 1 1 1 0 0 5 1 1 1 0 0 1 某学生依据这些数据做…...
PyQt学习之简介
1.Python图形界面称为程序的用户交互界面,英文称之为 UI (user interface) Tkinter 基于Tk的Python库,Python官方采用的标准库,优点是作为Python标准库、稳定、发布程序较小,缺点是控件相对较少。 wxPython 基于wxWidgets的Py…...
深入理解前端缓存
前端缓存是所有前端程序员在成长历程中必须要面临的问题,它会让我们的项目得到非常大的优化提升,同样也会带来一些其它方面的困扰。大部分前端程序员也了解一些缓存相关的知识,比如:强缓存、协商缓存、cookie等,但是我…...
K-means聚类算法详解与实战
一、引言 K-means聚类算法是一种无监督学习算法,旨在将数据点划分为K个不同的聚类或群组,使得同一聚类内的数据点尽可能相似,而不同聚类间的数据点尽可能不同。在图像处理、数据挖掘、客户细分等领域有着广泛的应用。本文将通过图文结合的方…...
python数据分析-糖尿病数据集数据分析预测
一、研究背景和意义 糖尿病是美国最普遍的慢性病之一,每年影响数百万美国人,并对经济造成重大的经济负担。糖尿病是一种严重的慢性疾病,其中个体失去有效调节血液中葡萄糖水平的能力,并可能导致生活质量和预期寿命下降。。。。 …...
【前端】 nvm安装管理多版本node、 npm install失败解决方式
【问题】If you believe this might be a permissions issue, please double-check the npm ERR! permissio或者Error: EPERM: operation not permitted, VScode中npm install或cnpm install报错 简单总结,我们运行npm install 无法安装吧包,提示权限问题…...
第11天:API开发与REST framework
第11天:API开发与REST framework 目标 使用Django REST framework构建RESTful API。 任务概览 学习序列化器的概念和使用方法。创建API视图和路由。实现API的权限和认证。 详细步骤 1. 学习序列化器 序列化器是Django REST framework中用于数据转换的组件&am…...
2024 年解锁 Android 手机的 7 种简便方法
您是否忘记了 Android 手机的 Android 锁屏密码,并且您的手机已被锁定?您需要使用锁屏解锁 Android 手机?别担心,您不是唯一一个忘记密码的人。我将向您展示如何解锁 Android 手机的锁屏。 密码 PIN 可保护您的 Android 手机和 G…...
利用机器学习重构视频中的人脸
引言 中国与英国的研究团队携手合作,开创了一种创新的视频面孔重塑技术。这项技术能够以极高的一致性对视频中的面部结构进行逼真的放大和缩小,且避免了常见伪影的产生。 从研究人员选取的YouTube视频样例中可见,经过处理后,女演…...
2025年Cursor免费续杯终极指南:绕过限制的自动化方案
1. 为什么需要Cursor免费续杯方案 作为一个长期使用AI编程工具的老用户,我完全理解学生和独立开发者面临的困境。Cursor作为一款优秀的AI编程助手,确实能大幅提升开发效率,但每月150次的免费额度对于项目开发来说实在捉襟见肘。特别是在调试和…...
Phi-4-reasoning-vision-15B高算力适配:双GPU显存占用监控与低并发稳定性验证
Phi-4-reasoning-vision-15B高算力适配:双GPU显存占用监控与低并发稳定性验证 1. 模型概述与技术背景 Phi-4-reasoning-vision-15B是微软推出的视觉多模态推理模型,专为复杂视觉理解任务设计。作为2026年发布的重要模型,它在图像理解、文档…...
AI 开发实战:技术决策为什么总失忆,决策日志可以怎么做
AI 开发实战:技术决策为什么总失忆,决策日志可以怎么做 一、这个问题为什么值得专门拿出来做? 在 AI 工程落地里,真正拖慢团队的往往不是模型本身,而是流程和协作方式没有跟上。 围绕“技术决策为什么总失忆࿰…...
给STM32密码锁加个“记忆”:手把手教你用CubeMX配置I2C读写EEPROM(AT24C02)
为STM32密码锁赋予持久记忆:CubeMX驱动AT24C02 EEPROM全攻略 当你的密码锁在断电后依然能记住最后一次设置的密码,这种"记忆"能力往往能大幅提升用户体验。本文将带你深入探索如何通过I2C总线连接AT24C02 EEPROM芯片,为基于STM32F1…...
UOS20远程桌面XRDP配置指南:告别黑屏卡顿,轻松实现Windows远程连接
UOS20远程桌面XRDP配置实战:从零搭建流畅的Windows远程控制环境 在混合办公成为常态的今天,跨平台远程控制需求激增。UOS20作为国产操作系统的代表,其XRDP服务能让Windows用户无缝接入,但配置过程中的黑屏、卡顿问题常令人却步。…...
GEE实战指南:Sentinel-2多光谱植被指数批量计算与优化
1. 为什么需要植被指数? 植被指数是遥感领域用来量化植被生长状态的核心指标。简单来说,就像医生用体温计判断病人是否发烧一样,我们可以通过卫星数据计算出的植被指数,快速了解一片区域的植被健康状况。Sentinel-2卫星提供的多光…...
SDMatte模型API接口安全设计:防止恶意调用与资源滥用
SDMatte模型API接口安全设计:防止恶意调用与资源滥用 1. 引言:API安全的重要性 在将SDMatte模型部署为公开API服务时,安全防护是首要考虑的问题。我们曾遇到一个真实案例:某图像处理API上线一周内,由于缺乏防护措施&…...
如何快速完成亚马逊SP-API注册:AWS IAM策略与角色配置详解
亚马逊SP-API高效注册指南:从AWS IAM配置到应用上线的全流程解析 当你的电商业务需要与亚马逊平台深度集成时,SP-API(Selling Partner API)将成为不可或缺的工具。作为亚马逊新一代的开发者接口,它比传统的MWS提供了更…...
Qwen3.5-4B-Claude-Opus零基础上手:Web交互页面功能详解与最佳实践
Qwen3.5-4B-Claude-Opus零基础上手:Web交互页面功能详解与最佳实践 1. 模型与平台介绍 Qwen3.5-4B-Claude-4.6-Opus-Reasoning-Distilled-GGUF 是一个基于 Qwen3.5-4B 的推理蒸馏模型,特别强化了结构化分析、分步骤回答、代码与逻辑类问题的处理能力。…...
快速上手Qwen3-4B:无需配置,GPU自适应优化的文本对话服务
快速上手Qwen3-4B:无需配置,GPU自适应优化的文本对话服务 想体验一个开箱即用、回答流畅、还能帮你写代码的AI助手吗?今天要介绍的Qwen3-4B Instruct-2507镜像,就是这样一个“傻瓜式”的纯文本对话服务。它基于阿里通义千问的官方…...
