Java 中的finally的探讨

目录

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里面有则返回执行到相应位置的值
发布了29 篇原创文章 · 获赞 33 · 访问量 5109

猜你喜欢

转载自blog.csdn.net/lxn1214/article/details/104782211