Java 基础面试题, Java 中 final,finally 和 finalize 各有什么区别?
Java 基础面试题, Java 中 final,finally 和 finalize 各有什么区别?
QA
Step 1
Q:: Java 中 final、finally 和 finalize 各有什么区别?
A:: 在 Java 中,final
、finally
和 finalize
是三个不同的关键字或方法,有各自的用途和意义。
1.
final
:
-
final
关键字可以用来修饰类、方法和变量。
-
被 final
修饰的类不能被继承。
-
被 final
修饰的方法不能被子类重写。
-
被 final
修饰的变量不可更改,一旦赋值后不能重新赋值。
2.
finally
:
-
finally
是一个用于异常处理的代码块,通常与 try
和 catch
语句一起使用。
-
无论是否发生异常,finally
块中的代码都会被执行。它通常用于资源释放,如关闭文件、关闭数据库连接等。
3.
finalize
:
-
finalize
是 Java 中的一个方法,定义在 Object
类中。
-
finalize
方法是在垃圾回收器准备回收对象之前调用的,可以用来执行一些清理操作,如释放资源。需要注意的是,finalize
的使用已经不推荐,因为它的执行时间不确定,且可能导致性能问题。
Step 2
Q:: 为什么在 Java 中不推荐使用 finalize 方法?
A:: 在 Java 中不推荐使用 finalize
方法的原因主要有以下几点:
1.
不可预测性:finalize
方法的执行时间是不可预测的,因为它依赖于垃圾回收器的运行时机。垃圾回收器何时执行是不确定的,这会导致 finalize
方法在不可预期的时间点被调用。
2.
性能问题:finalize
方法的存在会增加垃圾回收的开销,因为垃圾回收器需要额外跟踪这些对象并在合适的时间调用 finalize
方法。这会影响程序的性能。
3.
替代方案:有更好的替代方案来进行资源管理,如使用 try-with-resources
语句或显式的关闭方法。这些方法更加清晰和高效,可以确保资源及时释放。
Step 3
Q:: final 关键字修饰的方法是否可以被继承?
A:: final
关键字修饰的方法不能被子类重写,但可以被继承。换句话说,子类可以使用父类的 final
方法,但不能修改其实现。
Step 4
Q:: finally 块的作用是什么?它是否一定会执行?
A:: finally
块的主要作用是用于资源释放,比如关闭文件流、释放数据库连接等。无论 try
块或 catch
块中是否发生异常,finally
块中的代码都会被执行。唯一不会执行 finally
块的情况是当 JVM 退出或线程在 try
或 catch
块中终止时。