面试官:final、finally、finalize 有什么区别?
重要说明:本篇为博主《面试题精选-基础篇》系列中的一篇,查看系列面试文章请关注我。
Gitee 开源地址:https://gitee.com/mydb/interview
本题目难度:低
常见程度:高
1.final 介绍
final 是 Java 语言中的一个关键字,使用 final 修饰的对象不允许修改或替换其原始值或定义。
final 可以用来修饰:类、方法、变量和参数,其中可以用来修饰“参数”这一项,容易被人遗忘,这是 final 的 4 种用法。
1.1 final 用法说明
- 当 final 修饰类时,此类不允许被继承,表示此类设计的很完美,不需要被修改和扩展。
- 当 final 修饰方法时,此方法不允许任何从此类继承的类来重写此方法,表示此方法提供的功能已经满足当前要求,不需要进行扩展。
- 当 final 修饰变量时,表示该变量一旦被初始化便不可以被修改。
- 当 final 修饰参数时,表示此参数在整个方法内不允许被修改。
1.2 final 用法展示
final 修饰类:
final class Animal {
}
final 修饰方法:
public class FinalExample {
public final void sayHi() {
System.out.println("Hi~");
}
}
final 修饰变量:
public class FinalExample {
private static final String MSG = "hello";
//......
}
final 修饰参数:
public class FinalExample {
public void sayHi(final String name) {
System.out.println("Hi," + name);
}
}
2.finally 介绍
finally 则是 Java 中保证重点代码一定要被执行的一种机制。
我们可以使用 try-finally 或者 try-catch-finally 来进行类似关闭 JDBC 连接、保证释放锁等动作。
2.1 finally 用法展示
try {
// do something
} finally {
// 一定会执行的代码
}
2.2 finally 扩展
有时候面试也会问:finally 是否一定会被执行?这是一个有诱导嫌疑的问题,正常情况下 finally 一定是会执行的,但有一个特殊情况 finally 也是不会执行的,特殊的实现代码和执行结果如下:
3.finalize 介绍
finalize 是 Object 类中的一个基础方法,它的设计目的是保证对象在被垃圾收集前完成特定资源的回收,但在 JDK 9 中已经被标记为弃用的方法(deprecated)。
在实际开发中不推荐使用 finalize 方法,它虽然被创造出来,但无法保证 finalize 方法一定会被执行,所以不要依赖它释放任何资源,因为它的执行极不“稳定”。在 JDK 9 中将它废弃,也很好的证明了此观点。
finalize 性能问题
finalize 除了执行“不稳定”之外,还有一定的性能问题。
因为 finalize 的执行是和垃圾收集关联在一起的,一旦实现了非空的 finalize 方法,就会导致相应对象回收呈现数量级上的变慢,有人专门做过 benchmark,大概是 40~50 倍的下降。
因为 finalize 被设计成在对象被垃圾收集前调用,这就意味着实现了 finalize 方法的对象是个“特殊公民”,JVM 要对它进行额外处理。finalize 本质上成为了快速回收的阻碍者,可能导致你的对象经过多个垃圾收集周期才能被回收。
总结
final、finally 和 finalize 从英文字面角度来看,看似很像,实则 3 者在 Java 中没任何关系。final 是用来修饰类、方法、变量和参数的关键字,被 final 修饰的对象不允许修改或替换其原始值或定义;finally 是 Java 中保证重点代码一定要被执行的一种机制;finalize 是 Object 类中的一个基础方法,它的设计目的是保证对象在被垃圾收集前完成特定资源的回收的,但其执行“不稳定”,且有一定的性能问题,已经在 JDK 9 中被设置为弃用的方法了。
参考 & 鸣谢
《Java核心技术面试精讲》
关注公众号:Java面试真题解析,查看更多 Java 面试题。

【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· PostgreSQL 和 SQL Server 在统计信息维护中的关键差异
· C++代码改造为UTF-8编码问题的总结
· DeepSeek 解答了困扰我五年的技术问题
· 为什么说在企业级应用开发中,后端往往是效率杀手?
· 清华大学推出第四讲使用 DeepSeek + DeepResearch 让科研像聊天一样简单!
· 推荐几款开源且免费的 .NET MAUI 组件库
· 实操Deepseek接入个人知识库
· 易语言 —— 开山篇
· Trae初体验
2017-11-29 react native android6+拍照闪退或重启的解决方案
2010-11-29 三层业务类(DAL)必用的通用方法之一