先贴代码:
import java.util.HashMap;
import java.util.Map;
public class FinallyTest {
public static void main(String[] args) {
ObjectTest obj=new ObjectTest();
System.out.PRintln("obj=="+obj.getMap());
StringTest str = new StringTest();
System.out.println("str=="+str.getValue());
StringObjTest strObj=new StringObjTest();
System.out.println("strObj=="+strObj.getValue());
IntegerTest integer=new IntegerTest();
System.out.println("Integer=="+integer.getValue());
}
}
class IntegerTest {
public Integer getValue() {
Integer j = new Integer(1);
try {
j=new Integer(10);
return j;
} finally {
j=j+new Integer(100);
}
}
}
class StringTest {
public String getValue() {
String j = "string_orgin";
try {
j="string_try";
return j;
} finally {
j = "string_finally";
}
}
}
class StringObjTest {
public String getValue() {
String j = new String("stringobj_orgin");
try {
j=new String("stringObj_try");
return j;
} finally {
j = new String("stringObj_finally");
}
}
}
class ObjectTest {
public Map<String, String> getMap() {
final Map<String, String> argMap = new HashMap<String, String>();
try {
argMap.put("tryKey", "2");
return argMap;
} finally {
argMap.put("finalKey", "2");
}
}
}
返回结果:
obj=={tryKey=2, finalKey=2}
str==string_try
strObj==stringObj_try
Integer==10
总结:在return返回之前 会将return的值拷贝一份,然后在执行finally,如果拷贝的变量类型是string、基本类型、包装基本类型的Boolean Integer Double Long 因为这些类型都是不可变的,想要改变值只能拷贝一个原来的值,finally操作的值只是操作的一个拷贝, 但是如果是对象 那么因为拷贝的一个对象引用 finally会改变原来在堆中的对象,所以会影响return 值
PS:1、顺序一定是执行try块,在执行finally 但是因为return返回机制的原因 导致因为返回类型导致的数据不同
2、执行顺序:1、在return前将数据压入栈中(如果是Boolean Integer Double Long不可变类型或者string类型 直接将值压进去,如果是可变的那么把堆中的地址引用压进去)
2、执行finally语句,因为string和Boolean Integer Double Long为不可变类型变量,如果改变会另外申请一块常量池内存,但是不会改变栈中的值,而对象的话因为是引用 所以Finally会改变其真实值
3、最后return栈中的值
新闻热点
疑难解答