java中有
值传递:方法调用时,实际参数把它的值传递给对应的形式参数,方法执行中形式参数值的改变不影响实际参 数的值。参数是原始类型int,long,float,byte,char,double、boolean、short等等。
对象的传递其实也是引用的传递。
引用传递:也称为传地址。方法调用时,实际参数的引用(地址,而不是参数的值)被传递给方法中相对应的形式参数,在方法执行中,对形式参数的操作实际上就是对实际参数的操作,方法执行中形式参数值的改变将会影响实际参数的值。
例如
string不是基本类型,但是传递参数时,为什么其原参数值没有发生变化,下面我们来看看new出String对象的那小段代码(String类中),也就是String类的构造函数:
publicString(String original) {
int size = original.count;
char[] originalValue = original.value;
char[] v;
if (originalValue.length > size) {
int off = original.offset;
v = Arrays.copyOfRange(originalValue, off, off+size);
} else {
v = originalValue;
}
this.offset = 0;
this.count = size;
this.value = v;
}
注意里面的char[],对String的存储实际上通过char[]来实现的。不知道你还记不记得在Java API中定义的那些基本类型的包装类。比如Integer是int包装类、Float是float的包装类等等。对这些包装类的值操作实际上都是通过对其对应的基本类型操作而实现的。String就相当于是char[]的包装类。包装类的特质之一就是在对其值进行操作时会体现出其对应的基本类型的性质。在参数传递时,包装类就是如此体现的。所以,对于String在这种情况下的展现结果的解释就自然而然得出了。同样的,Integer、Float等这些包装类和String在这种情况下的表现是相同的。
下面就是传递对象的一小段代码:
public class ZhiShu {
public void setMapValue(Map maps){
maps.put("3","3");
maps.put("4","4");
}
public static void main(String[] args) {
ZhiShu z=new ZhiShu();
Map map=new HashMap();
map.put("1","1");
map.put("2","2");
z.setMapValue(map);
System.out.println(map);
}
}
|