在finally,final,finalize区别详解(上)中有这样一句话:return 语句会把后面的值复制到一份用来返回,如果return的是基本类型的,finally里对变量的改动将不起效果,如果 return 的是引用类型的,改动将可以起效果。
下面对这句话用几个例子进行说明:
例1:
public class Demo {
int b;
public int test() {
try {
b = 111;
return b;
} finally {
b = 6;
System.out.println("b1=" + b);
}
}
public static void main(String[] args) {
Demo d = new Demo();
System.out.println("b2=" + d.test());
}
}
打印结果:
b1=6
b2=111
这里return返回的是值,并且这个值它是作为一个临时变量存在的,所以在finally中没有被改变,而作为成员变量的b确实被改变了!
例2:
public class Demo2 {
HashMap<Integer, String> map = new HashMap<Integer, String>();
public HashMap<Integer, String> test() {
try {
map.put(111, "222");
return map;
} finally {
map.put(111, "333");
map = null;
}
}
public static void main(String[] args) {
Demo2 d = new Demo2();
System.out.println(d.test().get(111));
}
}
打印结果:
333
这里成员变量map已经被置为null,但是通过改变map指向的内存中的值来改变了return返回的数据。
下面用画了一个图来帮助理解。