final,finally和finalize的区别?

1 个回答

  • 李靖
    疑是仙女下凡来,回眸一笑胜星华。
    这三个名字很像,但在 Java 里的作用完全不一样: ## 1. **`final`**(关键字) **作用** * **修饰类** → 类不能被继承 * **修饰方法** → 方法不能被子类重写(Override) * **修饰变量** → 变量值不能被重新赋值(对于引用变量,引用不能改,但对象内容可以改) **示例**: ```java final class A {} // 不能被继承 class B { public final void show() {} // 子类不能重写 } final int x = 10; // x 不能被重新赋值 ``` ## 2. **`finally`**(异常处理结构的一部分) **作用** * 用在 `try...catch...finally` 中,`finally` 里的代码**无论是否发生异常都会执行**(除非 `System.exit()` 之类直接终止)。 * 常用来释放资源(关闭文件、数据库连接等)。 **示例**: ```java try { int a = 1 / 0; } catch (Exception e) { System.out.println("异常:" + e.getMessage()); } finally { System.out.println("一定会执行"); } ``` ## 3. **`finalize()`**(`Object` 类的方法) **作用** * 是 `Object` 类里的一个方法,垃圾回收器在回收对象前会调用它,给对象最后一次自我清理的机会。 * 已被官方**不推荐使用**(JDK 9 开始标记废弃),因为调用时间和是否调用都不确定,不能依赖它释放关键资源。 **示例**: ```java @Override protected void finalize() throws Throwable { System.out.println("对象被回收前执行"); } ``` ## 4. 对比表 | 名称 | 类型 | 作用范围 | 关键点 | | ---------- | --- | ------------ | ------------ | | `final` | 关键字 | 类、方法、变量 | 限制继承、重写、赋值 | | `finally` | 代码块 | 异常处理结构 | 一定执行(释放资源) | | `finalize` | 方法 | `Object` 类方法 | 垃圾回收前调用(已废弃) |
    发布于 2025-08-12 20:07 •IP属地 江西
    举报
    评论
    收藏