Java之finally、final、finalize的区别

这是一道比较常见的面试题,考察应聘者的Java基本功。其实我一直觉得这道面试题挺奇怪的,因为他仨除了长得像之外,在功能上没有任何相似之处。

经典回答如下:

  1. finallyJava的异常处理机制分为:抛出异常(throws)和捕获异常(try - catch)。fianlly的作用是不管代码块是否发生异常,保证一段代码一定会被执行,用法是try - fianlly或者try - catch -fianlly。像关闭JDBC连接,释放锁这样的动作就需要放到fianlly里执行。
  2. finalfinal可以用在类上,变量上,方法上。用在类上表明这个类不能被继承;用在变量上表明这个变量不能被改写;用在方法上表明这个方法不能被覆写(Override)的。
  3. finalizefinalize的作用是在对象被当作垃圾回收前,完成特定资源的回收。是一个比较鸡肋的方法,属于Java的历史遗留问题,不建议使用。在Java9中已经被标记为过时方法。

有了上面的了解,我们现在看两个比较有意思的问题,供大家思考,有可能会在笔试题中出现哦!

先看下面的代码:

Java之finally、final、finalize的区别

示例图1

请思考以下问题:

  1. 当x=4,y=2时,调用fianllyTest方法,返回值是多少?“fianlly”会不会被打印?
  2. 当x=4,y=2时,调用fianllyTest方法,返回值是多少?

答案:1.返回值是2,finally会被打印

2.返回值是-1

再看一个关于final的题,看如下代码:

Java之finally、final、finalize的区别

示例图2

我们已经知道了,fianl修饰的变量是不能更改的,那请问示例图2中输出的姓名和年龄是什么呢?

答案是:

[userName=lisi, age=36]

也许有人就疑惑了,不是不能修改嘛,怎么还变了呢?这里的不能更改是指user这个引用不能更改,不能指向新的user对象。而不是user指向的这个实例对象的内容不能修改。大家对着示例图3,一定要好好理解下。

Java之finally、final、finalize的区别

示例图3

https Java http ide
分享到:

您可能还会对下面的文章感兴趣: