2013-01-19 70 views
1

代碼解釋的Java輸出

class Test { 
    public static void main(String args[]) { 
     StringBuffer a = new StringBuffer("A"); 
     StringBuffer b = new StringBuffer("B"); 
     modify(a, b); 
     System.out.println(a + " " + b); 
    } 

    public static void modify(StringBuffer a, StringBuffer b) { 
     a.append(b); 
     a = b; 
     System.out.println(a + " " + b); 
    } 
} 

我明白print語句在功能上modify我也知道StringBuffer類修改字符串就地因此a.append(b)使得字符串是指「AB」。

我的問題是如何將String a更改爲功能modify之外的「AB」,但語句a=b對功能modify沒有影響。 基本上,什麼時候變量通過值傳遞,何時通過引用?

+1

這可能會讓你感興趣http://stackoverflow.com/questions/40480/is-java-pass-by-reference – Pshemo

+0

是的,它的確如此。謝謝。 +1 –

回答

2

這裏有一個簡單的圖片:

main       modify 

StringBuffer <------a   a 
    ^      | 
    +--------------------------+ 

StringBuffer <------b   b 
    ^      | 
    +--------------------------+ 

main,既ab是點分隔的StringBuffer實例的引用。當main調用modify時,它通過參考文獻ab拷貝(按值傳遞)。 modify可以更改StringBuffer實例的內容,但是如果它更改ab的值,它只能在其自己的本地副本上運行,並不會影響指向main和和b指向的內容。

最基本的答案是,一切是按值傳遞,但傳遞對象時,它的參考傳遞(按價值計算),而不是對象本身。

2

Java總是使用按價值傳遞。在引用的情況下,它是引用的值。當您傳遞引用時,可以更改引用引用的對象,但分配給其他對象的引用不會有任何後果。

因此,在您的情況下,a所指的對象可以更改,但引用不能指定給其他對象(它可以是這樣的,但是沒有效果)。

0

包含對象的變量實際上是對象的引用。所以如果你將它分配給另一個變量,那麼這兩個變量都指向同一個對象。

當您將一個變量傳遞給函數時,該值將被傳遞。

在一個對象的情況下,傳遞的值是一個引用。

因此,您可以將b分配給a進行修改,但效果是參考b的局部值,它們在此之後都是相同的,並引用對象b。當你將b附加到a時,你正在修改變量a引用的對象。