final & finally & finalize()

final

  • 修饰类:不嫩被继承,不能和abstract一同修饰
  • 修饰方法:不能重写
  • 修饰变量:声明时需赋初值

finally
执行try-catch 语句就一定会执行fianlly语句

finally 语句不一定会执行:

  • 如果try-catch 语句里面有System.ext(0) -->停止虚拟机(0表示正常退出) ,整个程序都结束了
    怎么执行finally语句呢
  • 一个线程正在执行try-catch语句的时候 被打断or终止…

这篇文章讲的简直不要太详细 有点儿长 耐心点儿

总结一下:

  • finally语句是在try-catch语句的控制转移语句(return throw break continue)之前执行的
  • 如果try-catch里面有return语句, “Java 虚拟机会把 finally 语句块作为subroutine直接插入到 try 语句块或者 catch 语句块的控制转移语句之前。但是,还有另外一个不可忽视的因素,那就是在执行 subroutine之前,try 或者 catch 语句块会保留其返回值到本地变量表中。待 subroutine 执行完毕之后,再恢复保留的返回值到操作数栈中,然后通过 return 或者 throw 语句将其返回给该方法的调用者。 ” (如果return是一个表达式或是函数 会执行这个表达式 or 函数 然后再将其值存放在本地变量表中)
  • 如果返回值类型是基本数据类型之一,那么finally里面的语句不会对这个值有什么改变 ;如果返回值是对象类型,那么finally里面的语句会对返回值产生影响。

再推荐一篇

下面的这个例子里面的 map = null 的情况没有弄明白 如果能告诉我原因 感激不尽!

import java.util.*;
public class TestFinally {
	public static Map fun(){
		Map<String, String> map = new HashMap<String, String>();
		try{
			map.put("key", "try");
			return map;
		} catch(Exception e){
			e.printStackTrace();
		} finally{
			map.put("key", "finally");        // finally
			//map = null;                    //  try  对于这个返回值 很 疑惑
		}
		return null;
	}
	public static void main(String[] args){
		Map<String, String> map = fun();
		System.out.println(map.get("key"));
	}
}

finalize

emmm是一个方法 GC
没怎么看明白 以后来补上

猜你喜欢

转载自blog.csdn.net/zf2015800505/article/details/84329458