Java值傳遞和引用傳遞

在Java中,若是參數是簡單類型,那麼傳遞的就是值,好比int、char等等;若是參數是對象類型(引用類型),那麼傳遞的就是地址(引用)。看下面的例子。
 
package hello1;
/**
 * Created by hyuan on 9/28/15.
 */
public class hello1 {
    public static void main(String[] args) {
        
        StringBuffer a=new StringBuffer("A");
        StringBuffer b=new StringBuffer("B");
        m(a,b);
        System.out.println(a+","+b);

        String aa="A";
        String bb="B";
        m(aa,bb);
        System.out.println(aa+",,,"+bb);
    }


    public static void m(StringBuffer x,StringBuffer y){
        x.append(y);
        y=x;
        System.out.println(x + ",," + y);
    }
    public static void m(String x,String y){
        x="aa";
        y=x;
        System.out.println(x+",,"+y);
    }

}
結果爲:
AB,,AB
AB,B
aa,,aa
A,,,B
因爲這裏函數的參數是2個StringBuffer對象,是對象類型,所以應該傳遞的是地址(引用)。可是應該注意x指向a所指向的內存(能夠理解爲都指向A),y指向b所指向的內存(能夠理解爲都指向B),x.append(y);把 y 指向的值追加給x指向的值,這個時候x和a所指向內存的內容都是AB,y指向的內存仍然是B。y=x;把 x 的值賦值給y,賦的是地址,從而致使y、x和a所指向內存的內容都是AB(y原來指向的,也就是b指向內存中的內容並無發生變化)。所以,a、y、x同時指向AB,而b仍然指向B。
System.out.println(x+","+y);這裏因此打印AB,AB,打印的實際上都是a指向內存的內容。
System.out.println(a+","+b);這裏因此打印AB,B,因爲是引用傳遞,因此a指向內存的內容在函數中被修改,而b指向內存中的內容沒有發生變化。

引用傳遞是把原來的地址(實參)傳遞給新的變量(形參),原來引用的仍然在那裏。app

相關文章
相關標籤/搜索