【大白话说Java面试题】【Java基础篇】第37题:final、finally、finalize的区别
📌专栏:大白话说Java面试题 — 01-Java基础篇
第37题:final、finally、finalize的区别
📚回答:
- 核心对比:
final、finally和finalize是三个看似相似但功能完全不同的关键字或方法,它们在 Java 中的应用场景和作用各不相同。
1. final
定义:
final是一个修饰符,用于声明类、属性和方法。- 类:被
final修饰的类不能被继承。 - 属性:被
final修饰的变量不可变(基本类型值不可更改,引用类型地址不可更改)。 - 方法:被
final修饰的方法不能被子类重写。
💡代码示例:
以下代码展示了final的用法:
finalclassFinalClass{// 该类不能被继承}classExample{finalintMAX_VALUE=100;// 不可变变量finalvoiddisplay(){System.out.println("This method cannot be overridden");}}2. finally
定义:
finally是异常处理机制的一部分,无论是否发生异常,finally块中的代码都会执行。- 常用于释放资源(如关闭文件流、数据库连接等)。
注意事项:
- 如果在
try或catch中调用了System.exit(0),则finally块不会执行。
💡代码示例:
以下代码展示了finally的用法:- 如果在
try{intresult=10/0;}catch(ArithmeticExceptione){System.out.println("除数不能为0");}finally{System.out.println("无论是否异常,都会执行");}3. finalize
定义:
finalize是Object类中的一个方法,在垃圾回收器(GC)回收对象之前会调用该方法。- 主要用于清理资源(如关闭文件句柄、释放内存等)。
注意事项:
- JVM 不保证
finalize方法一定会被调用。 - 从 Java 9 开始,
finalize被标记为过时(Deprecated),推荐使用AutoCloseable接口(如try-with-resources)来管理资源。
💡代码示例:
以下代码展示了finalize的用法:- JVM 不保证
classResource{@Overrideprotectedvoidfinalize()throwsThrowable{System.out.println("资源被释放");}}publicclassMain{publicstaticvoidmain(String[]args){Resourceresource=newResource();resource=null;// 断开引用System.gc();// 建议JVM进行垃圾回收}}4. 对比总结
| 特性 | final | finally | finalize |
|---|---|---|---|
| 用途 | 修饰类、属性、方法 | 异常处理中确保代码块一定会执行 | 在 GC 回收对象前进行资源清理 |
| 可变性 | 不可变 | 总是执行 | 不保证一定会执行 |
| 适用场景 | 防止继承、重写或修改 | 资源释放、善后处理 | 过时,推荐使用try-with-resources |
💡面试官视角:
- 面试官可能会问“
finally是否一定会执行?”答:除非调用了System.exit(0)或 JVM 崩溃,否则finally块一定会执行。 - 面试官可能会追问“为什么
finalize被废弃?”答:因为finalize的执行时机不确定,可能导致资源延迟释放或未释放,推荐使用更可靠的资源管理方式(如try-with-resources)。
