final、finally、finalize的区别?
时间: 2023-05-01 13:00:15 浏览: 98
final是Java中的关键字,用于修饰类、方法和变量,表示它们不可被继承、重写或修改。
finally是Java中的关键字,用于定义在try-catch语句块中的一个代码块,无论是否发生异常,finally中的代码都会被执行。
finalize是Java中的Object类的一个方法,用于在对象被垃圾回收之前执行一些清理工作,例如关闭文件或释放资源。
相关问题
final、finally、finalize 区别?
### Java 中 `final`、`finally` 和 `finalize()` 的区别
#### final 关键字
`final` 是一种修饰符,可用于变量、方法和类。
- **修饰变量**
当用于变量时,`final` 表明该变量一旦赋值就不能改变其引用或基本类型的值。Java 允许存在未立即赋初值的 `final` 变量,即所谓的空白 `final` 。这种情况下,初始化工作由构造函数负责完成[^1]。
```java
public class FinalVariableExample {
final int value;
public FinalVariableExample(int val){
this.value = val; // 初始化发生在构造器中
}
}
```
- **修饰方法**
对于方法而言,加上 `final` 后意味着此方法不可被子类覆写(override),不过仍然能够重载(overload)。在某些场景下,使用 `final` 能够提高程序的安全性和性能优化的可能性,尽管现代 JVM 已经减少了这方面的需求[^3]。
```java
public final void show(){
System.out.println("This method cannot be overridden.");
}
```
- **修饰类**
若一个类被定义成 `final` 类型,则不允许其他类从此类派生新的子类。这意味着此类内的所有成员方法自动成为最终方法(`final`),从而增强了安全性并阻止了多态行为的发生[^2]。
```java
final class MyFinalClass{
// Class content here...
}
```
#### finally 块
`finally` 主要应用于异常处理机制之中,通常与 try-catch 结构一起配合使用。无论是否抛出了异常,也不论是否有 catch 子句捕获到异常,位于 try 或者 catch 后面的 `finally` 部分总是会被执行,除非遇到了极端情况如系统崩溃等。即使在 try 内部有 return 语句的情况下,也会优先执行 `finally` 块的内容后再返回结果[^4]。
```java
public String divideNumbers(int a, int b) {
try {
if (b == 0) throw new ArithmeticException();
return "Result is " + (a / b);
} catch (ArithmeticException e) {
return "Cannot divide by zero!";
} finally {
System.out.println("Finally block executed");
}
}
```
#### finalize() 方法
这是来自 `Object` 类的一个受保护的方法,默认实现为空操作。它主要用于对象销毁前做一些清理资源的工作,比如关闭文件流或其他外部连接。然而需要注意的是,自 JDK 9 开始官方已经不推荐依赖于此方法来进行必要的清理活动,而是建议采用更可靠的替代方案,例如显式的 close 接口或者尝试-with-resources 语法来管理资源生命周期。
```java
@Override
protected void finalize() throws Throwable {
super.finalize();
// Cleanup code goes here.
}
```
请分别说明: * final finally finalize?
- `final` 是 Java 中的一个关键字,用于修饰变量、方法和类。当修饰变量时,表示该变量的值不能被修改(即常量)。当修饰方法时,表示该方法不能被子类重写。当修饰类时,表示该类不能被继承。
- `finally` 是 Java 中的一个关键字,用于定义在 try-catch 语句中的一个代码块。无论是否发生异常,`finally` 块中的代码总是会被执行。通常用于执行一些必要的清理操作,例如关闭文件或释放资源。
- `finalize` 是 Java 中的一个方法,它是在对象被垃圾回收之前调用的。该方法可以被子类重写,用于在对象销毁前执行一些清理操作,例如释放非 Java 资源。然而,由于在 Java 9 中已经废弃了 `finalize` 方法,并且不推荐使用,因此在实际开发中应尽量避免使用它。
阅读全文
相关推荐













