返回

分清 final、finally、finalize:一个字节也不许差!

后端

在 Java 语言中,有很多看起来很相似,但是用途却完全不同的语言要素。这其中,final、finally 和 finalize 就是比较容易混淆的三个概念。在本文中,博主将用实例剖析这些概念,帮助你分毫不差地搞明白它们之间的区别。

final

final 是 Java 中的一个,用于修饰变量、方法和类。

  • 修饰变量时,表示该变量的值在编译后就不能再被修改。
  • 修饰方法时,表示该方法不能被子类重写。
  • 修饰类时,表示该类不能被继承。

finally

finally 是 Java 中的一个关键字,用于修饰 try/catch 语句块。无论 try/catch 语句块是否发生异常,finally 语句块中的代码都会被执行。

finalize

finalize 是 Java 中的一个方法,用于在对象被回收之前做一些清理工作。finalize 方法由垃圾回收器自动调用。

区别

  • final 是一个关键字,而 finallyfinalize 是方法。
  • final 可以修饰变量、方法和类,而 finally 只可以修饰 try/catch 语句块,finalize 只可以修饰对象。
  • final 修饰的变量的值在编译后就不能再被修改,finally 语句块中的代码无论是否发生异常都会被执行,finalize 方法在对象被回收之前被自动调用。

举个栗子

// 定义一个 final 变量
final int age = 18;

// 定义一个 final 方法
final void printAge() {
    System.out.println("Age: " + age);
}

// 定义一个 finalize 方法
@Override
protected void finalize() {
    System.out.println("Object is being finalized");
}

public class Person {

    public static void main(String[] args) {
        // 创建一个 Person 对象
        Person person = new Person();

        // 调用 printAge 方法
        person.printAge();

        // 将 person 对象置为 null,以便垃圾回收器回收它
        person = null;

        // 调用 System.gc() 方法,强制垃圾回收器运行
        System.gc();
    }
}

运行上面的代码,输出如下:

Age: 18
Object is being finalized

从输出中可以看出,final 修饰的变量的值在编译后就不能再被修改,finally 语句块中的代码无论是否发生异常都会被执行,finalize 方法在对象被回收之前被自动调用。