谈谈final、finally、finalize的区别

这是一道再经典不过的面试题了,我们在各个公司的面试题中几乎都能看到它的身影。final、finally和finalize虽然长得像孪生三兄弟一样,但是它们的含义和用法却是大相径庭。这一次我们就一起来回顾一下这方面的知识。

final:如果一个类被final修饰,意味着该类不能派生出新的子类,不能作为父类被继承。因此一个类不能被声明为abstract,又被声明为final。将变量或方法声明为final。可以保证他们在使用的时候不被改变。其初始化可以在两个地方:一是其定义的地方,也就是在final变量在定义的时候就对其赋值;二是在构造函数中。这两个地方只能选其中的一个,要么在定义的时候给值,要么在构造函数中给值。被声明为final的方法也只能使用,不能重写。

public final class FinallyTest{
   //在定义时初始化
   public final int A = 10;
   //在初始化块中初始化
   public final int B;
    {
     B = 20;
    }
   //非静态final变量不能再静态初始化块中初始化
   public final int C;
   static{
     C = 30;
   } 
   //静态变量不能再初始化块中初始化
   public static final int  D;
   {
    D = 40;
   }
   //静态final变量不能在构造器中初始化
   public static final int E;
   public FianlTest(){
    E = 50;
   }
}

finally:在异常处理的时候,提供finally块来执行任何的清除操作。如果抛出一个异常,那么相匹配的catch字句就会执行,然后控制就会进入finally块,前提是有finally块。

public final class FinallyTest{
 public static void main(String[] args){
   try{
      throw new NullPointerException();
   }catch(NullPointerException e){
      System.out.println("程序抛出了异常");
   }finally{
     //这楼里总会被执行,不受break,return影响
     //如数据库连接的close()一般写在这里,可以降低程序的出错几率
     System.out.println("执行了finally语句块");
   }
}
}

finalize:finalize是方法名,java技术允许使用finalize()方法在垃圾收集器将对象从内存中清除出去之前做必要的清理工作。这个方法是在垃圾收集器确认一个对象没有被引用时对这个对象调用的。它是在Object类中定义的,因此,所有的类都继承了它。子类覆盖finalize()方法已整理系统资源或者执行其他清理工作。finalize()方法是在垃圾收集器删除对象之前对这个对象调用的。

它属于java.lang.Object类,它的定义如下:Java代码

protected void finalize() throws Throwable { }众所周知,finalize()方法是GC(garbage collector)运行机制的一部分在此我们只说说finalize()方法的作用是什么呢?finalize()方法是在GC清理它所从属的对象时被调用的,如果执行它的过程中抛出了无法捕获的异常(uncaught exception),GC将终止对改对象的清理,并且该异常会被忽略;直到下一次GC开始清理这个对象时,它的finalize()会被再次调用。

public final class FinallyTest{
  //重写finalize()方法
  protected void finalized throw Throwable{
     System.out.println("执行了finaalized()方法");
  }
  public static void main(String[] args){
   FinallyTest ft = new FinallyTest();
   ft = null;
   System.gc(); 
  }
}

原文发布于微信公众号 - 国产程序员(Monday_lida)

原文发表时间:2018-07-24

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

扫码关注云+社区

领取腾讯云代金券