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



