final,finally,finalize三者的含义和区别

final表示不可变的,它可以用来修饰类,方法和变量。

当它修饰类的时候表示该类是不能被继承的,因为抽象类就是用来被继承的,所以abstract关键字和final关键字不能共存。

当它修饰方法的时候表示该方法是不能被重写的。

当它修饰变量的时候表示该变量的值不能发生变化也就是该变量为一个常量。对于用final修饰的变量我们必须在申明它的时候赋值或者是在构造函数中给它赋值。

 

finally是异常处理中的一个关键字,通常的结构是这样的:

try{  } catch(){  } finally{   },

它一般用于资源释放,比如我们可以在finally块中关闭数据库连接,在这个结构中不管异常有没有发生finally中的代码都会执行。

但是finally中的代码不是一定会被执行。在以下情况下不会执行finally中的代码:

  1. 在进入try块之前程序发生异常。
  2. 在try块中调用了System.exit(0)终止了虚拟机的运行。
  3. 在try块或catch块中程序被中断,比如说死机。

我们再来看下面这个例子:

public class Demo02 {
    public static void main(String[] args) {
        System.out.println(methd());
    }
    public static int methd(){
        int num = 1;
        try{
            return num;
        }catch (Exception ex){
            return 0;
        }finally {
            num++;
        }
    }
}

程序运行的结果为:1

这个例子中finally中的代码究竟是在return前还是return后执行的呢?你可能认为是在return 前执行的,我们来看一下程序执行的过程,执行到try块中的return num的时候num的值1会被作为返回值存放到栈中但是这时程序并不会返回,而是去执行num++,num的值变为2,然后程序返回结束,此时返回的还是栈中的num值1。

我们再来看另一个例子:

public class Demo02 {
    public static void main(String[] args) {
        System.out.println(methd());
    }
    public static int methd(){
        int num = 1;
        try{
            return num;
        }catch (Exception ex){
            return 0;
        }finally {
           return 2;
        }
    }
}

这段程序的运行结果为2

在程序执行到try块中的return num时将num中的值1作为返回值保存在栈中,然后执行finally块中的代码,return 2,此时栈中的返回值变为了2,所以最后的结果为2.

 

总结一下:

  1. finally在try块和catch块return执行后,返回前执行。
  2. 如果finally中没有return,则其执行结果不影响try和catch中已确定的返回值。
  3. 如果finally中有return,则其执行结果会直接返回。

 

 

finalize: 是Object类的一个方法,因为所有的类都继承自Object类,所以所有的类都有finalize方法。  在垃圾收集器将该对象清除出内存之前会先调用它的finalize方法,做一些内存清理工作,通常这部分内存是非java内存,如socket,finalize只会被调用一次。

发布了16 篇原创文章 · 获赞 0 · 访问量 1185

猜你喜欢

转载自blog.csdn.net/xiaxiaomao1981/article/details/104040039