final、finally、finalize 的区别?
final、finally、finalize是 Java 中三个形似但功能完全不同的关键字 / 方法,核心区别如下:
# 1. final(关键字)
核心作用:用于修饰类、方法、变量,限制其可变性;
具体用法:
- 修饰类:类不能被继承(如
final class String); - 修饰方法:方法不能被重写(子类无法修改该方法);
- 修饰变量:变量不能被重新赋值(基本类型:值不变;引用类型:引用地址不变,对象内容可修改);
- 修饰类:类不能被继承(如
示例:
final int num = 10; // num = 20; // 编译报错(变量不能重写赋值) final class FinalClass {} // class SubClass extends FinalClass {} // 编译报错(类不能被继承)1
2
3
4
5
# 2. finally(关键字)
核心作用:用于
try-catch-finally异常处理结构,无论try块是否抛出异常、catch块是否执行,finally块都会执行;常用场景:释放资源(如关闭文件流、数据库连接),确保资源不泄露;
注意事项:
finally块中若有return,会覆盖try/catch块的return值;示例:
public static int testFinally() { try { return 1; } catch (Exception e) { return 2; } finally { System.out.println("finally执行"); // 必然执行 // return 3; // 若添加,会覆盖try的return 1,返回3 } } // 调用后输出:finally执行,返回11
2
3
4
5
6
7
8
9
10
11
# 3. finalize(方法)
核心作用:
Object类的 protected 方法,用于对象被 GC 回收前的资源释放(如释放本地内存、关闭资源);执行机制:对象被 GC 标记为可回收后,GC 会调用该方法,之后才真正回收对象;
缺点:
- 执行时间不确定(无法保证何时被 GC 调用);
- 效率低(可能导致对象延迟回收);
- 已被 Java 9 标记为 deprecated(过时),推荐用
try-with-resources或AutoCloseable替代;
示例:
class Resource { @Override protected void finalize() throws Throwable { System.out.println("对象被回收前执行finalize"); // 释放资源(如关闭连接) super.finalize(); } }1
2
3
4
5
6
7
8
# 核心区别总结
final:限制可变性(类、方法、变量);finally:异常处理中确保代码执行(释放资源);finalize:对象回收前的资源释放(已过时)。
#
上次更新: 12/30/2025