一,首先 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语句都会对其进行覆盖
}
}
}