final finally finalize 区别
时间: 2025-06-16 14:22:31 浏览: 8
### Java 中 final、finally 和 finalize 的区别
#### 1. **final**
`final` 是一个关键字,用于确保类、方法或变量的不可变性。以下是其具体用途:
- **修饰变量**:如果一个变量被声明为 `final`,则该变量的值不能被修改。对于基本数据类型,这意味着值本身不可改变;对于引用类型,这意味着引用的地址不可改变,但引用的对象内容可以改变[^3]。
- **修饰方法**:如果一个方法被声明为 `final`,则该方法不能被子类重写。这有助于防止子类改变父类方法的行为。
- **修饰类**:如果一个类被声明为 `final`,则该类不能被继承。因此,`final` 类中的所有方法默认都是 `final` 的,因为它们无法被重写。
示例代码如下:
```java
final int number = 10; // 基本类型变量,值不可变
// number = 20; // 错误:无法重新赋值
final StringBuilder sb = new StringBuilder("Hello"); // 引用类型变量,引用不可变
sb.append(" World"); // 正确:对象内容可变
// sb = new StringBuilder("Java"); // 错误:无法重新赋值引用
class FinalClass {
final void show() { // 方法不可被重写
System.out.println("Final Method");
}
}
// class SubClass extends FinalClass {} // 错误:FinalClass 不能被继承
```
#### 2. **finally**
`finally` 是异常处理机制的一部分,用于定义无论是否发生异常都会执行的代码块。它通常与 `try-catch` 结合使用,确保关键资源(如文件流、数据库连接等)能够被正确释放[^4]。
示例代码如下:
```java
try {
int result = 10 / 0; // 可能抛出 ArithmeticException
} catch (ArithmeticException e) {
System.out.println("捕获到除零异常:" + e.getMessage());
} finally {
System.out.println("Finally 块始终执行"); // 无论是否发生异常,此行都会输出
}
```
#### 3. **finalize**
`finalize` 是 `Object` 类中的一个方法,在对象被垃圾回收器回收之前调用,用于执行清理操作。然而,从 Java 9 开始,官方明确建议不要依赖于 `finalize` 方法,因为它存在不确定性,可能导致资源泄漏和性能问题[^1]。
示例代码如下:
```java
class TestClass {
@Override
protected void finalize() throws Throwable {
System.out.println("对象即将被垃圾回收");
super.finalize();
}
}
public class Main {
public static void main(String[] args) {
TestClass obj = new TestClass();
obj = null; // 标记对象为可回收
System.gc(); // 请求垃圾回收(不保证立即执行)
}
}
```
需要注意的是,`finalize` 方法的调用时间是不确定的,并且可能永远不会被调用[^2]。
---
### 总结
- **`final`**:用于确保类、方法或变量的不可变性,提升代码的安全性和性能。
- **`finally`**:用于在异常处理中定义必须执行的代码块,确保资源释放。
- **`finalize`**:用于在对象被垃圾回收前执行清理操作,但由于其不确定性和潜在风险,已不再推荐使用。
---
阅读全文
相关推荐
















