1、典型回答
final、finally、finalize 是 Java 中三个不同的关键字,它们除了长得像之外,其他的(作用和含义)完全不同。
它们三个的区别就好像:雷、雷锋、雷峰塔之间的区别。(是三个完全不同的东西)
final、finally、finalize的区别如下:
- final:表示不可变性,用于修饰类、方法和变量 ,当用于类时,表示该类不能被继承;当用于方法时,表示该方法不能被子类重写(覆盖);当用于变量时,表示该变量的值不能被修改(成为常量)。final 关键字提供了不可变性的特性,用于约束一些不希望被修改或继承的类、方法和变量
- finally:用于定义在 try-catch 结构之后的一个代码块。无论是否有异常抛出,finally 块中的代码都会被执行。它通常用于释放资源或执行一些必须在代码块结束时执行的清理工作,例如关闭数据库连接、释放文件锁等
- finalize:Object 类的一个方法,用于在对象被垃圾回收之前执行一些清理工作。Java 允许在对象被垃圾回收之前执行特定的操作,finalize方法就提供了这样的机制。但需要注意的是,由于垃圾回收的时机是不确定的,finalize方法的执行时间也是不确定的,因此一般不推荐使用 finalize 方法,并且在 JDK 9 开始被标记为 deprecated(弃用)。
所以,final 是用于修饰类、方法和变量,表示不可变性;finally保证关键代码块无论是否捕获到异常,都会被执行;finalize是Object 类的方法,用于在对象被垃圾回收之前进行清理
2、全面剖析
final用于修饰类、方法和变量,具体使用如下:
public static final String USERNAME = "一曲无忧";
finally 用于定义在 try-catch 结构之后一定会执行的代码块,具体使用如下:
finalize 是 Object 类的一个方法,用于在对象被垃圾回收之前执行一些清理工作,具体使用如下:
3、知识扩展
3.1、被 final 修饰的变量具有哪些好处?
- 不可变性:final修饰的变量在初始化之后就不能再被修改。这样可以确保变量的值始终保持不变,避免了意外或不必要的修改,提高代码的可靠性和可维护性
- 安全性:被 final 修饰的变量是不可变的,因此它在多线程环境下是线程安全的
- 性能优化:由于 final 变量的值不可变,编译器在编译时就可以进行一些优化,如在循环中提前计算表达式的结果、缓存变量值等,从而提高程序的运行效率
- 不存在可见性问题:被 final 修饰的变量具有强有力的可见性保证。当一个线程在写 final 变量时,其他线程将会立即看到该变量的最新值,而不会出现脏读或可见性问题
- 代码可读性和维护性:通过使用 final 修饰变量,可以明确地表示变量是一个常量,不应该被修改。这能够提高代码的可读性,让其他开发人员更容易理解和维护代码
3.2被 final 修饰的变量属性,在创建时必须要赋值么
被 final 修饰的变量可以有两种赋值方式:
- 创建时直接赋值
- 在构造方法中进行赋值
如果不满足以上任意一个条件,则程序会报编译错误
因此,被 final 修饰的变量,在创建时可以不用赋值,在构造方法中赋值,程序依然可以正常运行