final, finally, finalize 的区别
-
final
1.1 修饰类
\quad 表示类不可被继承
\quad 示例:final class String
1.2 修饰方法
\quad 表示方法不可被子类重写
\quad 示例:public final void show() { ... }
1.3 修饰变量
\quad 基本类型变量值不可变,引用类型变量地址不可变
\quad 示例:final int MAX = 100; final List<String> list = new ArrayList<>(); // 可修改list内容,不可重新赋值
-
finally
与异常处理配合使用,保证代码必定执行:
\quad • 无论是否发生异常
\quad • 即使try/catch中有return语句
\quad 典型应用:try { // 打开文件 } catch (IOException e) { // 处理异常 } finally { // 必定关闭文件 }
-
finalize
Object类定义的方法,对象被回收前执行:
\quad • 执行时机由JVM决定
\quad • Java 9起被标记为过时方法
\quad 替代方案:使用AutoCloseable
接口
\quad 示例:protected void finalize() throws Throwable { // 资源清理(不推荐) }
关键差异总结
特性 | 作用域 | 执行确定性 | 典型用途 |
---|---|---|---|
final | 编译时约束 | 绝对 | 定义不可变结构 |
finally | 运行时保证 | 确定 | 资源清理 |
finalize | 对象生命周期 | 不确定 | 遗留资源回收(已过时) |