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(),回收垃圾。