您的位置:首页 > 其它

finally和return 执行顺序

2015-11-24 09:44 316 查看
先贴代码:

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栈中的值
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: