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 {@Overrideprotected void finalize() throws Throwable {// 资源释放或清理工作super.finalize();}
}