java中的“值傳遞”和“引用傳遞”

 和大多數流行的編程語言一樣,函數體的傳入參數分爲“值傳遞”和“引用傳遞”兩種。

(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

發佈了31 篇原創文章 · 獲贊 5 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章