一,final
final可以用于修饰变量,方法,类。
1,当修饰变量时,如果是成员变量,必须在声明的时候或者在构造器初始化,如果是本地变量,在声明的时候赋值。
2,修饰方法时,代表方法不能被重写。
3,修饰类的时候,代表这个类不能被继承,
二,finally
finally是在异常处理里用到的
除了下面两种情况finally不会执行。
1:在进入try块之前就出现了异常,会直接结束;2:在try块中强制退出时不会执行finally块。
其他情况finally始终执行。
那么执行的顺序是什么呢?
如果try块中有return 表达式;那么finally是在return的表达式执行完,此时不会return,在finally块执行完再return,但是如果finally块中有return,会直接return。如果表达式返回的是基础类型,finally里的语句不会改变返回值,如果是引用类型,finally块里如果改变了引用的对象的属性值,会改变返回值。下面根据每种情况给出例子:
1,try块有return,finally块的执行顺序
public class Main{ public static void main(String[] args) { System.out.println(testFianlly()); } public static int testFianlly(){ try{ return 1+1; }catch (Exception e){ return 0; }finally { System.out.println("finally"); } } }
输出结果:
finally
2
2,finally块里有return,会直接返回。
public class Main2 { public static void main(String[] args) { System.out.println(testFianlly()); } public static int testFianlly(){ try{ return 2; }catch (Exception e){ return 0; }finally { System.out.println("finally"); return 3; } } }输出结果:
finally
3
3,try块返回的是基础类型,finally块里对其修改,不会影响返回的值。
public class Main2 { public static void main(String[] args) { System.out.println(testFianlly()); } public static int testFianlly(){ int res=0; try{ return res+4; }catch (Exception e){ return 0; }finally { res+=3; System.out.println("finally"); } } }输出结果:
fianlly
4
4,try块里return的是引用类型,fianlly块里对其修改会影响对象的值,因为改变的是对象,返回的是引用,引用找到对象,但是对象在finally里已经被改变了。
public class Main2 { public static void main(String[] args) { System.out.println(testFianlly()); } public static Person testFianlly(){ Person person = new Person("gch",24); try{ return person; }catch (Exception e){ return null; }finally { person.setName("cxh"); System.out.println("finally"); } } } class Person{ String name; int age; public Person(String name, int age) { this.name = name; this.age = age; } public void setName(String name) { this.name = name; } public void setAge(int age) { this.age = age; } @Override public String toString() { return "Person{" + "name='" + name + '\'' + ", age=" + age + '}'; } }输出结果:
finally
Person{name='cxh', age=24}
三,finalize
finalize是Object类的一个方法,不是一个关键字,只是和前面两个长得像而已。
finalize方法是垃圾回收时被调用的。一旦垃圾回收器准备好释放对象占用的空间时,将首先电泳其finalize方法,并且在下一次垃圾回收动作发生时,才会真正回收对象占用的内存。