目录
finally的特点深入讨论
Java中三个最像的关键字 final、finalize、finally 的区别
Java中三个最像的关键字 final、finalize、finally 的区别
final 关键字
- 修饰类: 叫做最终类,不能被继承。例如 Java中有String、Math、System等等均为final类
- 修饰方法:最终方法,不能被覆盖
- 修饰变量:基本变量,值不能遍,引用类型,地址不可变
- 作为形参:拷贝引用,为了避免引用的地址值发生改变。
final class Test{
private final int a = 100;
public void demo(final int a){
}
}
finalize()方法
当对象被判定为孤儿对象时候,JVM隔段时间会自动调用此方法,将其回收。
- 自动回收: JVM内存耗尽,一次性回收所有垃圾对象与程序内容。
- 手动回收: System.gc(); 通知JVM触发垃圾回收
finally关键字
这个关键字时常存放到异常捕获时候,可以存放语句,这段语句最终一定会被执行。
finally经常用来在管理一些资源对象
public class Test{
public static void main(String[] args){
try{
File file = new File("文件路径+文件名");
}catch(Exception e){
System.err.println(e.getMessage());
}finally{
file.close();
}
}
}
finally在try{}catch(){}finally{}中的执行原理与顺序
public class TestReturnValue {
public static void main(String[] args) {
int result = m1();
System.out.println(result);
}
public static int m1() {
int a =10;
try {
a = 20;
throw new RuntimeException();
}catch(Exception e) {
a = 30;
return a;
}finally {
a = 40;
}
}
}
结果是打印:30
此类问题用到了java 内部的一个设计方式
通过反编译对JVM执行的字节码指令进行分析:
反编译:javap-verbose 文件名称(是.class) > 自定义文件命名成.bytecode
Code:
内部是对栈的操作,总是将栈顶元素优先弹出。
简单的结论就是
- finally内代码块内容一定执行,但是,要有赋值顺序,如果在try,catch里面有则返回执行到相应位置的值