作者|雷哥来源|Java面试真题解析(ID:aimianshi666)转载请联系授权(微信ID:GG_Stone),final修饰的对象不允许修改或替换其原有的值或定义。final可用于修饰:类、方法、变量、参数,其中可用于修饰“参数”项,容易被遗忘。这些是final的4种用法。1.1final的使用说明当一个类被final修饰时,这个类是不允许被继承的,也就是说这个类的设计是完美的,不需要修改和扩展。当该方法被final修改时,该方法不允许任何从该类继承的类重写该方法,说明该方法提供的功能已经满足当前需求,无需扩展。当final修饰一个变量时,意味着该变量一旦被初始化就不能被修改。当final修饰一个参数时,意味着这个参数在整个方法内是不允许被修改的。1.2Finalusage显示最终修改类:finalclassAnimal{}最终修改方法:publicclassFinalExample{publicfinalvoidsayHi(){System.out.println("Hi~");}}最终修改变量:publicclassFinalExample{privatestaticfinalStringMSG="hello";//。.....}final修改参数:publicclassFinalExample{publicvoidsayHi(finalStringname){System.out.println("Hi,"+name);}}2.finally引入finally是保证关键代码必须在Java中执行机制。我们可以使用try-finally或try-catch-finally来执行关闭JDBC连接和确保释放锁等操作。2.1finally用法展示try{//dosomething}finally{//肯定会执行的代码}2.2finally扩展有时候面试也会问: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方法。
