final、finally与finalize的区别

本文介绍了Java中final、finally和finalize的用法。final可修饰类、成员变量,修饰类时类不能被继承,修饰变量时赋值后值不再改变;finally用于try/catch语句;finalize是Object类的方法,在对象被回收时调用。

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

final

当用final修饰类的时,表明该类不能被其他类所继承。当我们需要让一个类永远不被继承,此时就可以用final修饰,但要注意:

final类中所有的成员方法都会隐式的定义为final方法。

final成员变量表示常量,只能被赋值一次,赋值后其值不再改变。类似于C++中的const。

  当final修饰一个基本数据类型时,表示该基本数据类型的值一旦在初始化后便不能发生变化;如果final修饰一个引用类型时,则在对其初始化之后便不能再让其指向其他对象了,但该引用所指向的对象的内容是可以发生变化的。本质上是一回事,因为引用的值是一个地址,final要求值,即地址的值不发生变化。 

finally

 finally作为异常处理的一部分,它只能用在try/catch语句中

finalize 

 finalize()是在java.lang.Object里定义的,也就是说每一个对象都有这么个方法。这个方法在gc启动,该对象被回收的时候被调用。

### 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、付费专栏及课程。

余额充值