final finally 和 finalize的区别

final、finally和finalize都是Java中的关键字,但它们的含义和用途却不同。

  • final 表示不可变,用于修饰类、方法和变量。

  • finally 表示无论如何都会执行的代码块,用于清理资源和恢复现场。

  • finalize 是Object类的一个方法,用于在对象被垃圾收集器回收之前释放资源和清理工作。

1.final

final是Java语言的关键字,可以用来修饰类、方法、变量等,表示这些元素是不可变的,一旦被赋值之后就不能再进行修改。final的作用如下:

  • 用于修饰类,表示该类不能被继承。
  • 用于修饰方法,表示该方法不能被子类重写。
  • 用于修饰变量,表示该变量只能被赋值一次,且不能被重新赋值。
  • 用于修饰方法参数和局部变量,表示它们只能被赋值一次,且不能被重新赋值。

代码示例:

public final class MyClass { // 该类不能被继承
    public final int num = 100; // 变量只能被赋值一次,且不能被重新赋值

    public final void myMethod(final int arg) { // 参数只能被赋值一次,且不能被重新赋值
        final int localVar = 200; // 局部变量只能被赋值一次,且不能被重新赋值
        System.out.println(num + arg + localVar);
    }
}

2.finally

finally是Java语言的关键字,用于定义在try-catch块中的一个代码块,在任何情况下,无论是否发生异常,该代码块都会被执行。finally块经常用于清理资源和恢复现场。

代码示例:

FileInputStream fis = null;
try {
    fis = new FileInputStream("test.txt");
    // 处理fis
} catch (FileNotFoundException e) {
    // 处理文件不存在异常
} finally {
    if (fis != null) {
        try {
            fis.close();
        } catch (IOException e) {
            // 处理关闭文件流异常
        }
    }
}

3.finalize

finalize是Java中一个Object类的protected方法,当一个对象即将被垃圾收集器回收时,会自动调用该对象的finalize()方法。子类可以重写该方法进行资源释放或类似的清理工作。但应该避免过度依赖该方法,因为不保证一定会执行,原因如下:

  • finalize()方法的执行时间不确定,它的调用是由JVM中某个优化算法所决定的,具体时间无法预测。

  • finalize()方法的调用依赖于垃圾回收器的工作机制,如果垃圾回收器没有运行或者没有回收相应的对象,那么finalize()方法也不会被调用。

  • finalize()方法的调用只有在对象被回收之前才会被执行,如果存在引用链或者存在其他原因导致对象没有被回收,那么finalize()方法就不会被调用。

  • 由于finalize()方法只会被执行一次,如果该方法由于某些原因抛出异常,那么这个对象的finalize()方法就不会再被调用,可能会造成资源泄漏等问题。

代码示例:

public class MyClass {
    @Override
    protected void finalize() throws Throwable {
        // 资源释放或清理工作
        super.finalize();
    }
}

你可能感兴趣的:(java,开发语言)