乐趣区

关于java:面试官finalfinallyfinalize-有什么区别

重要阐明:本篇为博主《面试题精选 - 根底篇》系列中的一篇,查看系列面试文章 请关注我
Gitee 开源地址:https://gitee.com/mydb/interview

本题目难度:低

常见水平:高

1.final 介绍

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

final 能够用来润饰:类、办法、变量和参数,其中能够用来润饰“参数”这一项,容易被人忘记,这是 final 的 4 种用法。

1.1 final 用法说明

  • 当 final 润饰类时,此类不容许被继承,示意此类设计的很完满,不须要被批改和扩大。
  • 当 final 润饰办法时,此办法不容许任何从此类继承的类来重写此办法,示意此办法提供的性能曾经满足以后要求,不须要进行扩大。
  • 当 final 润饰变量时,示意该变量一旦被初始化便不能够被批改。
  • 当 final 润饰参数时,示意此参数在整个办法内不容许被批改。

1.2 final 用法展现

final 润饰类:

final class Animal {}

final 润饰办法:

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

final 润饰变量:

public class FinalExample {
    private static final String MSG = "hello";
    //......
}

final 润饰参数:

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

2.finally 介绍

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

咱们能够应用 try-finally 或者 try-catch-finally 来进行相似敞开 JDBC 连贯、保障开释锁等动作。

2.1 finally 用法展现

try {// do something} finally {// 肯定会执行的代码}

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 核心技术面试精讲》

关注公众号:Java 面试真题解析,查看更多 Java 面试题。

退出移动版