Java面试题一:final、finally、finalize三个关键字的区别和联系

1、final:

    final可以修饰类、变量、方法。

    final修饰的类不能被继承,因为抽象类就是用来继承的,所以abstract和final关键字不能共存,

    final修饰类的时候表示该类不能被继承,final不能修饰接口,final修饰方法表示该方法不能被重写,final在修饰变量的时候,必须在申明的时候赋值,表示该变量是一个常量不能被重新赋值。

2、finally:

    finally一般用于资源的释放,比如关闭数据库的连接,作用在异常try—catch—finally中,在处理异常的时候,通常将我们一定要执行的代码放到finally代码块中,不管异常有没有发生,finally中的代码都会执行。

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

     ① 在进入try代码块之前出现异常

     ② 在try代码块中调用System.exit(0)终止了虚拟机的运行

     ③ 在try块或者catch块中程序被中断,比如死机

举例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 {
        num++;
    }
    }
}

//程序运行的结果为:1

  上面的程序运行的结果为什么是1呢?

  我们思考下,打印出来的method()方法应该打印的是1还是2呢?finally中的代码是在return之前执行还是在finally之后执行呢?当执行到try代码块执行的后return num的值1首先会被存放到栈中,这时程序不会返回值,而是去执行num++,num++的值变成了2,然后程序返回结束,此时方法还是返回的是栈中的1。

举例2:

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

大家猜一猜这个例子返回的结果是1还是2?分析一下,首先try代码块执行,将num的值1存储在栈中,然后继续执行的是finally代码块,返回的值是2,将2存储在栈中,取代了栈中的1,所以最后的结果是2。

总结:

1. finally在try块和catch块return执行后,返回前执行,且返回的值是前面的。

2. 如果finally中没有return,则其执行结果不影响try和catch中已确定的返回值。

3. 如果finally中有return,则其执行结果会直接返回。

3、finalize

   finalize是一个方法,属于Object类的一个方法,finalize()方法是GC在清理它所属的对象时被调用的。而Object类是所有类的父类,finalize()该方法一般由垃圾回收器调用,当调用垃圾gc()回收垃圾的时候,由垃圾回收器调用finalize(),回收垃圾。

猜你喜欢

转载自blog.csdn.net/Sunshineoe/article/details/114604429