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栈中的值
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栈中的值
相关文章推荐
- while和if的区别
- 【support包学习】DrawerLayout的使用
- C# 位操作
- java常用 api
- java正则表达式抽取html数据
- 使用glide 时候在listview 或者 grideview 中图片自动拉伸问题
- iOS 笔记-关于用户交互的那些事
- sql server 查询某个表的所有触发器名称
- 实现icon图标的数字累加
- Codeblocks使用
- 为什么Java中1000==1000为false而100==100为true
- Xamarin.Android之添加.so文件
- Android 内存泄漏调试
- DPM(Defomable Parts Model) 源码分析-训练(三)
- mfc 对话框添加菜单
- 测试utp端口是否开放
- Unity3D之跑酷地图弯曲效果
- PHP函数补完:var_export()
- Struts2和Spring的整合
- 网站提速的相关注意点