面试题:请简述 final、finally、finalize 的区别?

1. final

final 是 Java 中的一个关键字,用于修饰类、方法和变量,表示“不可改变”的含义。

用法:

  1. 修饰类
    • 表示该类不能被继承
    • 例如:String 类就是 final 类。
  2. 修饰方法
    • 表示该方法不能被重写(Override)
    • 例如:Object 类中的 getClass() 方法就是 final 方法。
  3. 修饰变量
    • 表示该变量是一个常量,一旦赋值后不能修改
    • 如果是基本数据类型,值不能改变;如果是引用类型,引用不能改变(但对象内部的状态可以改变)。

2. finally

finally 是 Java 中用于异常处理的关键字,通常与 try-catch 块一起使用。

作用:

  • finally 块中的代码无论是否发生异常都会执行,通常用于释放资源(如关闭文件、数据库连接等)。
  • 即使 try 或 catch 块中有 return 语句,finally 块中的代码也会在方法返回之前执行。

示例:

try {
    // 可能抛出异常的代码
    int result = 10 / 0;
} catch (ArithmeticException e) {
    System.out.println("捕获异常:" + e.getMessage());
} finally {
    System.out.println("finally 块执行"); // 无论是否发生异常都会执行
}

3. finalize

finalize 是 Object 类中的一个方法,用于在对象被垃圾回收器回收之前执行一些清理操作。

作用:

  • 当垃圾回收器确定某个对象不再被引用时,会调用该对象的 finalize 方法。
  • finalize 方法通常用于释放非 Java 资源(如文件句柄、网络连接等)。

注意:

  • finalize 方法的执行不保证及时性,甚至不保证一定会执行(如果程序提前退出,垃圾回收器可能不会运行)。
  • 从 Java 9 开始,finalize 方法被标记为 @Deprecated,推荐使用 Cleaner 或 PhantomReference 等替代方案。

示例:

class MyObject {
    @Override
    protected void finalize() throws Throwable {
        try {
            System.out.println("finalize 方法执行");
        } finally {
            super.finalize();
        }
    }
}

public class Main {
    public static void main(String[] args) {
        MyObject obj = new MyObject();
        obj = null; // 使对象成为垃圾
        System.gc(); // 建议 JVM 执行垃圾回收
    }
}

4. 三者的区别

特性finalfinallyfinalize
类型关键字关键字方法
作用修饰类、方法、变量,表示不可改变用于异常处理,确保代码一定执行对象被回收前的清理操作
使用场景定义常量、防止继承或重写释放资源、确保代码执行释放非 Java 资源
执行时机编译时或运行时异常处理时垃圾回收时
是否推荐推荐使用推荐使用不推荐使用(Java 9 已弃用)

总结

  • final:用于修饰类、方法、变量,表示不可改变。
  • finally:用于异常处理,确保代码一定执行。
  • finalize:用于对象回收前的清理操作,但已不推荐使用。
THE END
点赞9 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容