Java中final、finally、finalize的用法与区别

一、final

  • final是一个修饰符,也是一个关键字
  • final修饰的类型无法被继承,经典的String类型。
  • fina修饰的方法无法被覆盖,但允许重载,类的private方法会被隐式指定为final修饰。
  • final修饰的变量因为不可变,所以被称为常量,存在于方法区常量池,当变量类型为基本数据类型时,变量值初始化后将不能改变,变量类型时引用类型时,变量值由于存储引用地址,所以变量引用将不能变为其他对象,但是对象内部的属性是可以修改的。

二、finally

  • finally是一个关键词,修饰代码块。
  • finally不能单独使用,通常于try或者try{...} catch配合使用,用于释放执行过程占用的资源。
  • finally修饰的块一定会被执行,当然,如果在程序执行中,JVM异常退出,是不会执行finally块的。执行System.exit(n)也会导致finally{...}不执行。
  • finally修饰的代码块会在方法结束之前执行,如果finally中含有return 语句,那么方法执行将会返回finally中的return结果,而不会执行try{...}或者catch{...}中的结果,所以一般情况不允许在finally出现return语句。代码示例:
  public class FinalDemo {
        public static void main(String[] args) {
            System.out.println(FinalDemo.execute());
        }

        public static String execute() {
           try {
                throw new RuntimeException("ex");
                //return "try";
           } catch (Exception ex) {
                return "catch";
           } finally {
               return "final";
           }
        }
  }

三、finalize

  • finalize()是Object对象的protected方法,通常子类重写该方法实现资源清理,GC在回收对象前会执行该方法。
  • finalize()存在的问题:
  1. Java语言规范并不能保证finalize()方法能被及时执行,也不能保证一定会被执行。
  2. finalize()方法可能带来性能问题,因为JVM通常在单独的低优先级线程中来执行finalize()。
  3. finalize()方法中,可将待回收的对象赋值给GC root可达的对象引用,从而达到对象再生的目的。
  4. finalize()方法最多被GC执行一次,但是可以通过对象调用。
原文地址:https://www.cnblogs.com/zhexuejun/p/14890499.html