和大多數流行的編程語言一樣,函數體的傳入參數分爲“值傳遞”和“引用傳遞”兩種。
(1)“值傳遞”傳入的參數是java語言中定義的基本數據類型(如int,char,double等)
(2)“引用傳遞”傳入的參數在java則是對象的一個"引用",這個"引用"的概念同C語言中的指針引用是一樣的。
那麼兩者之間到底有何異同呢?
“值傳遞”傳入的參數在函數體內部變成了局部變量,這個局部變量是輸入參數的一個拷貝,所有的函數體內部的操作都是針對這個拷貝的操作,函數執行結束後,這個局部變量也就完成了它的使命,它影響不到作爲輸入參數的變量。而“引用傳遞”則有很大的不同,當函數體內部對輸入變量改變時,實質上就是在對這個對象的直接操作,就會影響到作爲輸入參數的變量。這就是兩者最重要的區別
通過下面的兩組代碼的對比就更能說明這一點
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