Java 面试之fina、finally、finalize
Java经典面试题
April 27, 2024
0 words
0 read

请你说一下 final、finally、 finalize 有什么不同?

💡

上面是一道非常经典并且非常基础的 Java 面试题目。面试官想考察的除了常见用法以及 Java 语法方面的知识,还有可能会深入提问到 Java 生命周期、垃圾回收以及并发性能方面的问题。

实践用法方面

finalJava 的关键字。以用来修饰类、方法、变量,分别有不同的意义,final 修饰的 class 代表不可以继承扩展,final 的变量是不可以修改的,而 final 的方法也是不可以重写的(override)。

finally 是 Java 保证重点代码一定要被执行的一种机制。我们可以使用 try-finally 或者 try-catch-finally 代码块来进行类似关闭连接,比如 JDBC 连接,Http 连接,在使用多线程并发中使用了 Lock 还可以在 finally 块中保证 unlock 的动作。

finalize 是 Object 中的一个方法。如下所示,这个方法会保证对象在被垃圾回收之前完成指定资源的回收。finalize 已经不推荐使用,可以看出在 Java9会被删除。

@Deprecated(since="9")
protected void finalize() throws Throwable { }

final 详解

  1. java.lang.String 类就是被 final 修饰的类。这样可以避免类中的 API 被使用者更改其基础功能,在一定程度上保证了安全。

  2. final 修饰变量或者参数的时候,可以避免意外赋值而导致的错误。final 的修饰在某种程度上明确了参数或者变了不可变的效果。可以用来保护某些只读数据,在并发编程中尤为明显。因为 final 修饰已经明确了不能再次被赋值。

finally 详解

finally 我们明确知道怎么使用,用在哪里就行了。在需要关闭连接资源、需要最后执行某些逻辑的时候需要使用 finally。思考下面的代码 finally 字符串会输出吗:

public static void main(String[] args) {
    try {
        System.out.println("try");
        System.exit(0);
    } finally {
        System.out.println("finally");
    }
}

输出结果只有一个“try”,但是在 finally 块中的“finally”却没有输出。因为 System.exit(0)会直接终止掉 JVM,所以“finally”不会输出。

finalize 详解

其实这个 finalize(),已经不再推荐使用了。在 Java9中会被删除。因为在程序的执行过程中我们其实是无法保证 finalize() 方法的执行时机。通常我们会在try-with-resources 中或者 try-finally 中进行资源的关闭和回收。

More Articles
See All