面试官:Final、Finally、Finalize 有什么区别?

开发 后端
final 是 Java 语言中的一个关键字,使用 final 修饰的对象不允许修改或替换其原始值或定义。finally 则是 Java 中保证重点代码一定要被执行的一种机制。

[[437496]]

作者 | 磊哥

来源 | Java面试真题解析(ID:aimianshi666)

转载请联系授权(微信ID:GG_Stone)

本题目难度:低

常见程度:高

1.final 介绍

final 是 Java 语言中的一个关键字,使用 final 修饰的对象不允许修改或替换其原始值或定义。

final 可以用来修饰:类、方法、变量和参数,其中可以用来修饰“参数”这一项,容易被人遗忘,这是 final 的 4 种用法。

1.1 final 用法说明

  • 当 final 修饰类时,此类不允许被继承,表示此类设计的很完美,不需要被修改和扩展。
  • 当 final 修饰方法时,此方法不允许任何从此类继承的类来重写此方法,表示此方法提供的功能已经满足当前要求,不需要进行扩展。
  • 当 final 修饰变量时,表示该变量一旦被初始化便不可以被修改。
  • 当 final 修饰参数时,表示此参数在整个方法内不允许被修改。

1.2 final 用法展示

final 修饰类:

  1. final class Animal { 
  2.  

final 修饰方法:

  1. public class FinalExample { 
  2.     public final void sayHi() { 
  3.         System.out.println("Hi~"); 
  4.     } 

final 修饰变量:

  1. public class FinalExample { 
  2.     private static final String MSG = "hello"
  3.  //...... 

final 修饰参数:

  1. public class FinalExample { 
  2.     public void sayHi(final String name) { 
  3.         System.out.println("Hi," + name); 
  4.     } 

2.finally 介绍

finally 则是 Java 中保证重点代码一定要被执行的一种机制。

我们可以使用 try-finally 或者 try-catch-finally 来进行类似关闭 JDBC 连接、保证释放锁等动作。

2.1 finally 用法展示

  1. try { 
  2.     // do something 
  3. } finally { 
  4.     // 一定会执行的代码 

2.2 finally 扩展有

时候面试也会问:finally 是否一定会被执行?这是一个有诱导嫌疑的问题,正常情况下 finally 一定是会执行的,但有一个特殊情况 finally 也是不会执行的,特殊的实现代码和执行结果如下:

3.finalize 介绍

finalize 是 Object 类中的一个基础方法,它的设计目的是保证对象在被垃圾收集前完成特定资源的回收,但在 JDK 9 中已经被标记为弃用的方法(deprecated)。

在实际开发中不推荐使用 finalize 方法,它虽然被创造出来,但无法保证 finalize 方法一定会被执行,所以不要依赖它释放任何资源,因为它的执行极不“稳定”。在 JDK 9 中将它废弃,也很好的证明了此观点。

finalize 性能问题

finalize 除了执行“不稳定”之外,还有一定的性能问题。

因为 finalize 的执行是和垃圾收集关联在一起的,一旦实现了非空的 finalize 方法,就会导致相应对象回收呈现数量级上的变慢,有人专门做过 benchmark,大概是 40~50 倍的下降。

因为 finalize 被设计成在对象被垃圾收集前调用,这就意味着实现了 finalize 方法的对象是个“特殊公民”,JVM 要对它进行额外处理。finalize 本质上成为了快速回收的阻碍者,可能导致你的对象经过多个垃圾收集周期才能被回收。

总结

final、finally 和 finalize 从英文字面角度来看,看似很像,实则 3 者在 Java 中没任何关系。final 是用来修饰类、方法、变量和参数的关键字,被 final 修饰的对象不允许修改或替换其原始值或定义;finally 是 Java 中保证重点代码一定要被执行的一种机制;finalize 是 Object 类中的一个基础方法,它的设计目的是保证对象在被垃圾收集前完成特定资源的回收的,但其执行“不稳定”,且有一定的性能问题,已经在 JDK 9 中被设置为弃用的方法了。

 

责任编辑:姜华 来源: Java面试真题解析
相关推荐

2021-12-10 12:01:37

finalfinallyfinalize

2020-11-02 08:12:52

finalJava开发

2024-04-03 15:33:04

JWTSession传输信息

2024-09-19 08:42:43

2023-02-17 08:10:24

2023-07-11 08:40:02

IO模型后台

2021-12-13 06:56:45

Comparable元素排序

2024-03-20 15:12:59

KafkaES中间件

2021-12-23 07:11:31

开发

2024-10-14 16:49:06

2023-02-09 07:01:35

转发重定向Java

2024-03-26 16:24:46

分布式事务2PC3PC

2023-12-13 13:31:00

useEffect对象浏览器

2022-05-16 11:04:43

RocketMQPUSH 模式PULL 模式

2023-02-20 07:19:14

2023-07-28 07:18:39

final继承结构

2021-12-27 06:57:40

This SuperJava

2021-03-27 10:56:17

promisethenfinally

2023-12-05 09:33:08

分布式事务

2021-05-10 08:01:12

BeanFactoryFactoryBean容器
点赞
收藏

51CTO技术栈公众号