和大多数流行的编程语言一样,函数体的传入参数分为“值传递”和“引用传递”两种。
(1)“值传递”传入的参数是java语言中定义的基本数据类型(如int,char,double等)
(2)“引用传递”传入的参数在java则是对象的一个"引用",这个"引用"的概念同C语言中的指针引用是一样的。
那么两者之间到底有何异同呢?
“值传递”传入的参数在函数体内部变成了局部变量,这个局部变量是输入参数的一个拷贝,所有的函数体内部的操作都是针对这个拷贝的操作,函数执行结束后,这个局部变量也就完成了它的使命,它影响不到作为输入参数的变量。而“引用传递”则有很大的不同,当函数体内部对输入变量改变时,实质上就是在对这个对象的直接操作,就会影响到作为输入参数的变量。这就是两者最重要的区别
通过下面的两组代码的对比就更能说明这一点
import java.util.*;

public class HashtableAdd...{
public static void main(String[] args)...{
Hashtable ht = new Hashtable();
StringBuffer sb = new StringBuffer();
sb.append("abc,");
ht.put("1",sb);
sb.append("def,");
ht.put("2",sb);
sb.append("mno,");
ht.put("3",sb);
sb.append("xyz.");
ht.put("4",sb);
Enumeration it = ht.elements();
while(it.hasMoreElements())...{
System.out.println(it.nextElement());
}
}
}

import java.util.*;

public class HashtableAdd2...{
public static void main(String[] args)...{
Hashtable ht = new Hashtable();
int sb=0;
ht.put("1",sb);
sb=1;
ht.put("2",sb);
sb=2;
ht.put("3",sb);
sb=3;
ht.put("4",sb);
Enumeration it = ht.elements();
while(it.hasMoreElements())...{
System.out.println(it.nextElement());
}
}
}
初看第一组代码,觉得结果应该是
abc,
abc,def,
abc,def,mno,
abc,def,mno,xyz.
但实际上是把对象时作为入口参数传给函数,实质上是传递了对象的引用,向Hashtable传递StringBuffer对象也是只传递了这个StringBuffer对象的引用!每一次向Hashtable表中put一次StringBuffer,并没有生成新的StringBuffer对象,只是在Hashtable表中又放入了一个指向同一StringBuffer对象的引用而已。
两组代码的结果应该是
abc,def,mno,xyz.
abc,def,mno,xyz.
abc,def,mno,xyz.
abc,def,mno,xyz.
3
2
1
0
本文详细解释了Java中函数参数的传递方式,包括值传递与引用传递的区别,并通过实例代码展示了不同类型参数在函数调用过程中的行为差异。
757

被折叠的 条评论
为什么被折叠?



