【Java】final, finally, finalize()

final关键字

java的final关键字用于变量,类或方法时,含义各不相同

变量: 应用于基本类型变量时,一旦初始化,变量值就不能修改;应用于引用变量时,该引用变量不能指向堆上的任何其他对象。

方法:该方法不能被子类重写

: 该类不能派生子类


关键字finally

关键字finally和try/catch语句块配对使用,即使有异常跑出,也能确保某段代码一定会执行。

finally语句块在try和catch之后,在控制权交回之前执行

在Java中,若在try-catch-finally的try语句块中插入return语句,finally语句块是否还会执行?

会执行。

public class finallyClass {
	public static String lem() {
		System.out.println("lem");
		return "return from lem";
	}
	
	public static String foo() {
		int x = 0;
		int y = 0;
		try {
			System.out.println("start try");
			int b = y / x;
			System.out.println("end try");
			return "returned from try";
		}catch (Exception ex) {
			System.out.println("catch");
			return lem() + "|returned from catch";
		}finally {
			System.out.println("finally");
		}
	}
	
	public static void bar() {
		System.out.println("start bar");
		String v = foo();
		System.out.println(v);
		System.out.println("end bar");
	}
	
	public static void main(String[] args) {
		bar();
	}
}

打印输出:

start bar
start try
catch
lem
finally
return from lem|returned from catch
end bar


可以看到,整个catch语句块都会执行,包括return语句里的函数调用,然后执行finally语句块,之后函数才真正返回

当退出try语句块时,finally语句块将会执行。即使我们试图从try语句块里跳出(通过return,break,continue等任何异常),finally语句块仍然会执行。

但有些情况下finally语句块将不会执行,比如:

如果虚拟机在try/catch语句块执行期间退出

如果执行try/catch语句块的线程被杀死中止了。

finalize方法

在真正对象销毁之前,自动垃圾收集器会调用finalize()方法。

因此,一个类可以重写Object类的fianlize()方法,以便定义在垃圾收集时的特定性为。

总结

final用于控制变量,方法或类是否“可更改”。finally用在try\catch语句块中确保一段代码一定会被执行。
而一旦垃圾收集器确定没有任何引用指向某个对象,就会在销毁该对象之前调用fianlize()方法,一般用于清理资源,例如关闭文件。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值