重要提示:本文为博主《面试题精选-基础篇》系列文章之一,请关注我查看系列专访文章。Gitee开源地址:https://gitee.com/mydb/interview本题难度:低常见程度:高一、Final介绍Final是Java语言中的一个关键字。用final修饰的对象不允许修改或替换其原始值或定义。final可以用来修饰:类、方法、变量、参数,其中可以用来修饰容易忘记的“参数”项。这些是final的4种用法。1.1final使用说明final修饰一个类时,这个类是不允许被继承的,也就是说这个类的设计是完美的,不需要修改和扩展。当该方法被final修改时,该方法不允许任何从该类继承的类重写该方法,说明该方法提供的功能已经满足当前需求,无需扩展。当final修饰一个变量时,意味着该变量一旦被初始化就不能被修改。当final修饰一个参数时,意味着这个参数在整个方法内是不允许被修改的。1.2finalusage显示finalmodificationclass:finalclassAnimal{}finalmodificationmethod:publicclassFinalExample{publicfinalvoidsayHi(){System.out.println("Hi~");}}final修饰变量:publicclassFinalExample{privatestaticfinalStringMSG="hello";//...}最终修改参数:publicclassFinalExample{publicvoidsayHi(finalStringname){System.out.println("Hi,"+name);}}2.Finally介绍Finally是Java中的一种机制,保证关键代码必须执行。我们可以使用try-finally或者try-catch-finally来执行关闭JDBC连接,确保锁被释放等操作。2.1finallyusagedisplaytry{//dosomething}finally{//肯定会执行的代码}2.2finallyextension有时候面试也会问:finally会被执行吗?这是一个疑似诱导的问题。一般情况下finally肯定会被执行,但是有一种特殊情况finally是不会被执行的。具体实现代码和执行结果如下:3.finalize简介finalize是Object类中对象的一个??基本方法,旨在保证对象在被垃圾回收前完成特定资源的回收,但是一直在JDK9中标记为弃用方法(deprecated),实际开发中不推荐使用finalize方法。虽然创建了,但并不能保证finalize方法一定会执行,所以不要依赖它来释放任何资源,因为它的执行极不稳定。它在JDK9中的弃用也很好地证明了这一点。finalize性能问题除了finalize执行“不稳定”之外,还有一定的性能问题。由于finalize的执行与垃圾回收相关联,一旦实现了非空的finalize方法,对应对象的回收速度就会减慢一个数量级。有人做过专门的benchmark,大概低了40~50倍。因为finalize被设计成在对象被垃圾回收之前调用,这意味着实现了finalize方法的对象是一个“特殊公民”,JVM要对其进行额外的处理。finalize本质上成为快速回收的障碍,这可能会导致您的对象在被回收之前经历多个垃圾回收周期。小结Final、finally和finalize从英文字面看似乎很相似,但实际上这三者在Java中是没有任何关系的。final是用于修饰类、方法、变量和参数的关键字。final修饰的对象不允许修改或替换其原有的值或定义;finally是Java中的一种机制,保证关键代码必须执行;finalize是Object类中的一个基本方法。它的设计目的是保证对象在被垃圾回收前完成特定资源的回收,但其执行“不稳定”,存在一定的性能问题。它已在JDK9中设置为Deprecated方法。参考&致谢《Java核心技术面试精讲》关注公众号:Java面试真题解析,更多Java面试题看。
