2013-10-04 216 views
3

我使用3個對象--StringBuilder,Integer和testobject - 傳遞給方法來更改其狀態。 正如預期的那樣,StringBuilder和testobject指向同一個對象,並且狀態是變化的,但它不適用於Integer對象。將對象傳遞給方法java

class testobject{ 
    int x = 1; 
} 

public class test{ 
    public static void main(String[] args){ 
     StringBuilder s1 = new StringBuilder("String"); 
     go(s1); 
     System.out.println(s1); 

     Integer s2 = new Integer("20"); 
     go1(s2); 
     System.out.println(s2); 

     testobject s3 = new testobject(); 
     go2(s3); 
     System.out.println(s3.x); 
    } 

    static void go(StringBuilder s1){ 
     s1.append("Builder"); 
    } 

    static void go1(Integer s2){ 
     s2 = 1; 
    } 
    static void go2(testobject s3){ 
     s3.x = 5; 
    } 



    Result: 
    StringBuilder 
    20 
    5 

    ExpectedResult: 
    StringBuilder 
    1 
    5 
+1

'Integer'對象是不可變的。通過嘗試將其分配給新號碼,您正在創建一個新對象。 – jonhopkins

+3

在Java中沒有任何內容被引用傳遞。 (在對象的情況下,它們是引用類型,按值傳遞。) – Sneftel

回答

5

看看你的三種方法:

static void go(StringBuilder s1){ 
    s1.append("Builder"); 
} 

static void go1(Integer s2){ 
    s2 = 1; 
} 

static void go2(testobject s3){ 
    s3.x = 5; 
} 

gogo2,你作出的修改對象的參數值是指。

go1中,您正在更改參數變量本身的值。這是非常不同的,並且因爲Java always uses pass-by-value,調用者看不到這種變化。

重要的是要明白,對象根本沒有傳遞給方法。相反,引用是。 s1,s2s3的值都是參考。如果您將變量看作像紙片一樣,每張紙上都有一個房子地址,它是從main中聲明的一張紙上覆制而來的。

方法體gogo2就像訪問地址在紙上的房子,並繪製前門。如果您使用原件紙片訪問房屋,您仍會在前門看到新的顏色。

go1的方法體就像是寫出寫在紙上的地址,然後寫一個新的地址。這不會改變房子,也不會改變原來的紙張。

+0

@ Jon - 我不需要記住這一點..我很好地解釋了 – user1050619

+2

@ user1050619:我不確定你的意思。你絕對*需要記住這一點......這是Java的一個基本部分。 –

+0

如果我們像'Integer s2 = new Integer(20)'一樣初始化對象,它會有所作爲,因爲我可以看到它有兩個構造函數,一個接受'String',另一個接受'int',如下所示: http://docs.oracle.com/javase/7/docs/api/java/lang/Integer.html – user2339071

-1

傳遞對象在方法如果u要傳遞的參數爲對象,而不是原始那麼Java對待路過對象作爲由value.becoz通你知道Java支持通過噪聲值概念。

這裏& p與上相同的附圖

public class ObjPass { 
    int value; 
    public static void main(String[] args) { 
     ObjPass p = new ObjPass(); 
     p.value = 5; 
     System.out.println("Before calling: " + p.value); 
     increment(p); 
     System.out.println("After calling: " + p.value);  
    } 
public static void increment(ObjPass a){ 
     a.value++; 

    } 

} 

o/p: 
       Before calling: 5 
          After calling: 6