考虑一下,以下两段程序分别会返回什么结果?
代码段1:
public static void main(String[] args){
int xx = 1;
add(xx);
System.out.print(xx);
}
public static void add(int temp){
temp++;
}
结论:输出xx为1
代码段2:
public static void main(String[] args){
Map<String,String> a = new HashMap<>();
List<Map> b = new ArrayList<Map>();
a.put("1", "a");
b.add(a);
a = null;
Map aa = b.get(0);
System.out.println(aa.get("1"));
}
结论:输出为a
总结: java中是采用的值传递策略,当传递基本数据类型作为方法入参时,实际上传递的是基本数据类型的数值,对于片段1来说,add(xx) = add(1) add内部跟xx没有任何关系了。
片段2也是同理,a,b是引用,他们分别引用的对象为new HashMap 和 new ArrayList 当调用b.add(a)时,等同于b.add(a的值),比如a的值为0x66(就是其所引用对象的地址), 那么就等同于b.add(0x66)。 正因如此,a引用指向了新的元素null时,并不会影响到已经保存到b中的0x66,也就是b.get(0),因此通过aa对象,是可以获取到key为1的值的。
如果还是有些疑惑,再看个例子:
public static void main(String[] args) {
Demo demo = new Demo();
demo.a = 1;
demo.b = 2;
List<Demo> demoList = new ArrayList<>();
System.out.println(demo); // com.test.Test11$Demo@42110406
demoList.add(demo);
demo=null;
System.out.println(demoList.get(0)); // com.test.Test11$Demo@42110406
}
虽然demo引用的对象从new Demo()变成了null,但是由于是值传递,所以两者输出相同
难度等级:★☆☆☆☆