final/finally/finalize,return和finally的执行顺序

一,首先 final,finally和finalize的区别:

1.final

    1)final修饰类,不能被继承。

    2)修饰方法,不能被重写或覆盖。而且final方法是静态绑定的,在编译时就确定好是哪个类的方法,所以final方法效率要高。

    3)修饰变量,只能赋值一次。

         当final修饰一个基本数据类型时,表示该基本数据类型的值一旦在初始化后便不能发生变化;

         如果final修饰一个引用类型时,则在对其初始化之后便不能再让其指向其他对象了,但该引用所指向的对象的内容是可以发生变化的。

    4)修饰参数,若某个参数被final修饰了,则代表了该参数是不可改变的

public void changeValue(final int i){
        //final参数不可改变
        //i++;
        System.out.println(i);
    }

2. finally

    是try语句中的一个语句体,不能单独使用,用来释放资源。

3. finalize

    概述:Object的成员方法,protected void finalize() 当垃圾回收器确定不存在该对象的更多引用时,由对象的垃圾回收器调用此方法。

 

二:

问:如果catch里面有return语句,请问finally的代码还会执行吗? 如果会,请问是在return前还是return后

答:会,return先建立返回路径,再执行finally,最后return再彻底返回

public class Test1 {
	public static void main(String[] args) {
		Demo d = new Demo();
		System.out.println(d.method());
	}
}
 
class Demo {
	public int method() {
		int x = 10;
		try {
			x = 20;
			System.out.println(1 / 0);
			return x;  //try和catch可能走其一,所以都要写return语句。
		} catch (Exception e) {
			x = 30;
			return x;  //ruturn执行了,建立出一个返回路径。将30用返回路径打包装到了一个箱子里,再看自己有没有finally语句。如果有,执行finally语句。虽然x的值改为40,但返回路径中的值并没有变化。
		} finally {						
			x = 40;  //这句话没有意义。finally应该写释放资源的代码。 千万不要在finally中写return语句,一旦这么写,try和catch中的return语句都没有意义。try和catch中建立任何的返回路径,finally中的return语句都会对其进行覆盖
		}
	}
}

 

你可能感兴趣的:(Java-基础)