Map map = new HashMap();
Map params = new HashMap();
map.put("params", params);
params.put("key", key);
Map的put不是put一个对象,而是put一个对象的引用!该对象更新后,Map里面被put的引用随着改变。
对于String,我用代码测试了一下:
String a = new String("111");
String b = a;
a = "222";
System.out.println(b);//结果是111
System.out.println(b.equals(a));//false
测试结果是b仍然为111。
String b = a;表示a和b指向同一个字符串"111"的引用。
a = "222";表示把a改变为指向"222"的应用,而此时b保持不变。
再看Sting数组
String a[] = { "1","2","3" },
String b[] = null;
b = a;
a[0] = "4";
System.out.println(b[0]); //结果是4
System.out.println(b.equals(a));//true
此时输出的又是4!这个跟上面的Map类似。
此时在方法中把对象(或数组)作为参数,方法调用时,参数传递的是对象的引用(地址),这时候b与a指向同一个内存地址,即同一个对象(数组),改变数组a的值的时候,也就相当于改变了b的值。
引用
Java对对象和基本的数据类型的处理是不一样的。和C语言一样,当把Java的基本数据类型(如int,char,double等)作为入口参数传给函数体的时候,传入的参数在函数体内部变成了局部变量,这个局部变量是输入参数的一个拷贝,所有的函数体内部的操作都是针对这个拷贝的操作,函数执行结束后,这个局部变量也就完成了它的使命,它影响不到作为输入参数的变量。这种方式的参数传递被称为"值传递"。
而在Java中用对象的作为入口参数的传递则缺省为"引用传递",也就是说仅仅传递了对象的一个"引用",这个"引用"的概念同C语言中的指针引用是一样的。当函数体内部对输入变量改变时,实质上就是在对这个对象的直接操作。
除了在函数传值的时候是"引用传递",在任何用"="向对象变量赋值的时候都是"引用传递"。
分享到:
2009-04-21 16:05
浏览 15902
评论