【大白话说Java面试题】【Java基础篇】第37题:final、finally、finalize的区别

📅 2026/7/5 1:02:19 👁️ 阅读次数 📝 编程学习
【大白话说Java面试题】【Java基础篇】第37题:final、finally、finalize的区别

📌专栏:大白话说Java面试题 — 01-Java基础篇

第37题:final、finally、finalize的区别

📚回答:

  • 核心对比
    finalfinallyfinalize是三个看似相似但功能完全不同的关键字或方法,它们在 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块中的代码都会执行。
    • 常用于释放资源(如关闭文件流、数据库连接等)。
  • 注意事项

    • 如果在trycatch中调用了System.exit(0),则finally块不会执行。

    💡代码示例
    以下代码展示了finally的用法:

try{intresult=10/0;}catch(ArithmeticExceptione){System.out.println("除数不能为0");}finally{System.out.println("无论是否异常,都会执行");}

3. finalize
  • 定义

    • finalizeObject类中的一个方法,在垃圾回收器(GC)回收对象之前会调用该方法。
    • 主要用于清理资源(如关闭文件句柄、释放内存等)。
  • 注意事项

    • JVM 不保证finalize方法一定会被调用。
    • 从 Java 9 开始,finalize被标记为过时(Deprecated),推荐使用AutoCloseable接口(如try-with-resources)来管理资源。

    💡代码示例
    以下代码展示了finalize的用法:

classResource{@Overrideprotectedvoidfinalize()throwsThrowable{System.out.println("资源被释放");}}publicclassMain{publicstaticvoidmain(String[]args){Resourceresource=newResource();resource=null;// 断开引用System.gc();// 建议JVM进行垃圾回收}}

4. 对比总结
特性finalfinallyfinalize
用途修饰类、属性、方法异常处理中确保代码块一定会执行在 GC 回收对象前进行资源清理
可变性不可变总是执行不保证一定会执行
适用场景防止继承、重写或修改资源释放、善后处理过时,推荐使用try-with-resources

💡面试官视角

  • 面试官可能会问“finally是否一定会执行?”答:除非调用了System.exit(0)或 JVM 崩溃,否则finally块一定会执行。
  • 面试官可能会追问“为什么finalize被废弃?”答:因为finalize的执行时机不确定,可能导致资源延迟释放或未释放,推荐使用更可靠的资源管理方式(如try-with-resources)。