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
没怎么看明白 以后来补上