在 Java 中,final
、finally
和 finalize
这三个关键字虽然名称相似,但它们的作用和用途是完全不同的。
final
final
是一个修饰符,可以用来修饰类、方法和变量。- 当用在变量上时,它表示该变量是常量,一旦赋值后其值就不能被改变。
- 当用在方法上时,它表示该方法不能被子类覆盖。
- 当用在类上时,它表示该类不能被继承。
finally
finally
是一个关键字,与异常处理相关。- 它用于
try-catch
语句中,定义了一个代码块,这个代码块在try
块和catch
块执行完毕后一定会被执行,无论是否发生异常。 finally
通常用于执行清理工作,如关闭文件流、释放资源等。
- 它用于
finalize
finalize
是一个方法。- 它是
java.lang.Object
类的一个 protected 方法,可以被子类重写。 finalize
方法在对象被垃圾收集器回收前执行,用于在对象生命周期结束前做一些清理工作,如关闭资源、释放内存等。- 从 Java 9 开始,
finalize
方法已被标记为过时(deprecated),推荐使用java.lang.ref.Cleaner
或其他方式来清理资源。
- 它是
示例
// final 变量
final int CONSTANT = 1;
// final 方法
final void cannotOverride() {
// 方法体
}
// final 类
final class UtilityClass {
// 类体
}
// 使用 finally 的 try-catch 语句
try {
// 尝试执行的代码
} catch (Exception e) {
// 异常处理代码
} finally {
// 无论是否发生异常都会执行的代码
}
// finalize 方法
class MyClass {
@Override
protected void finalize() throws Throwable {
super.finalize();
// 清理代码
}
}
注意
- 使用
finalize
方法进行资源清理并不是一个好的实践,因为它的执行时机不确定,可能会导致资源泄露。推荐在try-with-resources
语句中使用自动关闭资源,或者使用其他显式的资源管理方式。 finally
块几乎总是与try
和catch
一起使用,确保即使在发生异常的情况下也能执行必要的清理工作。final
关键字用于表示不可变性,它在 Java 中是一个非常重要的概念,用于提高程序的安全性和性能。