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















































初看第一组代码,觉得结果应该是
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