final - finally - finalize

本文详细介绍了Java中final关键字的用途,包括修饰类、方法及变量的意义和作用;解释了finally在异常处理中的作用及其重要性;并探讨了finalize方法的功能与使用场景。

final—修饰符(关键字)

如果一个类被声明为final,意味着它不能再派生出新的子类,不能作为父类被继承。因此一个类不能既被声明为 abstract的,又被声明为final的。一般,当一个类设计完美或者不需要被继承才用于修饰类,或者一个工具类也可以被申明为final。一个类为final,意味着其内部的方法都是final的。

将方法声明为final,则方法在子类中不能被重写,表示这个方法很重要,不应该被改变或者这个方法已经足够好了。同时,final方法允许编译器转化为inline调用,也就是这段代码会被调用其的方法在这个方法内部调用,而不是采用通常的方法调用;好处是不必执行再保存断电,压栈等消耗较大的操作。

将成员或者变量定义为final,那么这个变量一旦被初始化就不能被修改,而初始化只能在定义或者构造函数中选一处进行。同时final可以修饰函数参数,对于对象final参数,那么这个对象在方法调用就不能被改变,增强代码的安全性和可读性。但是,传入对象的属性还是可以被修改。


finally—异常处理

异常处理时提供 finally 块来执行清除操作。如果抛出一个异常,那么相匹配的 catch 子句就会执行,然后控制就会进入 finally 块(如果有的话)。finally主要用于清理非JVM内存资源。


finalize—方法

Java 技术允许使用 finalize() 方法,在垃圾收集器将对象从内存中清除出去之前,做必要的清理工作。这个方法是由垃圾收集器在确定这个对象没有被引用时对这个对象调用的。它是在 Object 类中定义的,因此所有的类都继承了它。子类覆盖 finalize() 方法以整理系统资源或者执行其他清理工作。finalize() 方法是在垃圾收集器删除对象之前对这个对象调用的。

但JVM不保证这个方法一定会被调用,同时JVM规范这个方法只会被调用一次。通常finalize用于一些不容易控制且非常重要的资源释放,比如IO,数据库连接等。

<think>我们正在讨论Java中的finalfinallyfinalize的区别。根据引用内容,这三个概念分别属于不同的领域: - final:关键字,用于修饰、方法、变量,表示不可变 - finally:异常处理机制的一部分,确保代码块一定执行 - finalize:Object的方法,在垃圾回收前被调用(已弃用) 下面我将详细解释每个概念,并比较它们的区别。</think>### Java 中 finalfinallyfinalize 的区别详解 #### 1. **final(不可变性修饰符)** - **核心作用**:声明不可变实体 - **应用场景**: - **修饰**:不可被继承(如 `String` ) ```java final class ImmutableClass { } // 禁止继承[^1][^2] ``` - **修饰方法**:方法不可被子类重写 ```java class Parent { final void secureMethod() { } // 子类不能覆盖此方法 } ``` - **修饰变量**:变量值不可修改(常量) ```java final double PI = 3.14159; // 值初始化后不可变[^5] ``` - **内存特性**: - 基本类型常量:值直接存储(栈/方法区) - 引用类型常量:引用地址不可变,对象内容可能可变[^4] #### 2. **finally(异常处理保障)** - **核心作用**:确保关键代码**必定执行** - **使用场景**: ```java FileInputStream fis = null; try { fis = new FileInputStream("file.txt"); // 文件操作... } catch (IOException e) { e.printStackTrace(); } finally { if (fis != null) { fis.close(); // 确保资源释放[^3] } } ``` - **关键特性**: - 无论是否发生异常都会执行 - 即使 `try/catch` 中有 `return` 语句仍会执行 - 需单独处理 `finally` 中的异常[^4] #### 3. **finalize(对象回收钩子)** - **核心作用**:对象被垃圾回收前执行清理(**已弃用**) - **工作机制**: ```java public class ResourceHolder { @Override protected void finalize() throws Throwable { try { cleanup(); // 清理非内存资源 } finally { super.finalize(); } } } ``` - **严重缺陷**: - 执行机不确定(依赖GC) - 可能引发资源泄漏 - JDK 9+ 标记为 `@Deprecated`[^1][^5] #### 三者的核心区别总结 | **特性** | final | finally | finalize | |----------------|--------------------------------|-----------------------------|------------------------------| | **类型** | 关键字 | 异常处理代码块 | Object 的方法 | | **作用** | 强制不可变性 | 确保代码执行 | 垃圾回收前清理资源 | | **执行机** | 编译期约束 | 异常处理后必定执行 | GC 运行不确定 | | **现状** | 广泛使用 | 关键资源处理必备 | JDK 9+ 已弃用 | | **典型场景** | 常量声明、安全设计 | 资源释放(文件/数据库连接) | 历史遗留资源清理(不推荐) | #### ⚠️ 重要注意事项 1. **资源释放优先选择 finally** 而非 `finalize`,因后者执行不可靠[^3] 2. **final 的常量优化** 编译器可能将 `final` 常量直接内联到代码中 3. **finally 中的 return 陷阱** 若 `finally` 和 `try` 同存在 `return`,`finally` 的返回值会覆盖 `try` 的返回值 4. **替代 finalize 的方案** 使用 `AutoCloseable` 接口配合 `try-with-resources`: ```java try (BufferedReader br = new BufferedReader(new FileReader("file.txt"))) { // 自动资源管理 } // 无需显式调用 close()[^4] ``` --- ### 📚 总结决策图 ```mermaid graph TD A[需要什么特性?] A --> B[需要不可变性?] -->|/方法/变量| FINAL A --> C[需要确保代码执行?] -->|资源清理| FINALLY A --> D[对象回收前操作?] -->|已弃用| FINALIZE ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值