final,finalize,finally的区别

本文解析了 Java 中 final、finally 和 finalize 的用法与区别:final 用于限制类、变量及方法不可被继承或修改;finally 用于确保在 try...catch 结构中总会执行的代码段;而 finalize 则是在对象被垃圾回收前提供的最后一次资源释放的机会。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

final
当这个关键字修饰一个类时,意味着他不能派生出新的子类
因此一个类abstract和final不能同时使用。


当final修饰变量或者方法时,可以保证他们在使用中不会被改变。被声明为final的变量必须在初始化时给定初值。同样,当final修饰一个方法时,这个方法不能被重载。


finally
异常处理(try...catch...finally)时提供finally来执行任何清楚操作。无论是否如何都会转入finally块。


finalize
finalize方法在垃圾回收器执行内存对象清理。这个方法是由垃圾收集器在确定这个对象没有被引用时对这个对象调用的。
如果内存足够,filalize()可能永远不被执行。
### Javafinalfinallyfinalize区别 #### 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`**:用于在对象被垃圾回收前执行清理操作,但由于其不确定性和潜在风险,已不再推荐使用。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值