2012-10-03 55 views
0

嗨,我讀了this關於堆棧溢出問題,並試圖做一個例子。引用和值混淆

我有下面的代碼:

public static void main(String[] args){ 
    int i = 5; 
    Integer I = new Integer(5); 

    increasePrimitive(i); 
    increaseObject(I); 

    System.out.println(i); //Prints 5 - correct 
    System.out.println(I); //Still prints 5 
    System.out.println(increaseObject2(I)); //Still prints 5 

} 

public static void increasePrimitive(int n){ 
    n++; 
} 

public static void increaseObject(Integer n){ 
    n++; 
} 

public static int increaseObject2(Integer n){ 
     return n++; 
} 

是否increaseObject打印5,因爲參考值該函數內部變化?我對嗎? 我很困惑爲什麼increasedObject2打印5而不是6.

任何人都可以請解釋嗎?

+0

您的意思是否使用'increaseObject(I);'? (注意'I'而不是'i') – lccarrasco

+1

Integer在Java中是不可變的。 相似的主題:http://stackoverflow.com/questions/5560176/java-is-integer-immutable – Alex

+0

@Alexey,那麼在這種情況下,考慮到Integer是不可變的,在'increaseObject'方法中發生了什麼? – rgamber

回答

1

問題是return n++;其中返回n,然後只增加。它的工作原理,如果你將其更改爲return ++n;return n+1;

不過還是你正試圖測試,因爲它是不可變的不Integer正常工作。你應該嘗試類似的東西 -

class MyInteger { 
    public int value; //this is just for testing, usually it should be private 

    public MyInteger(int value) { 
     this.value = value; 
    } 
} 

這是可變的。

然後,您可以將引用傳遞給該類的實例,並將其從調用的方法中進行變更(在該實例中更改值value)。

變化的方法 -

public static void increaseObject(MyInteger n){ 
    n.value++; 
} 

,並稱之爲 -

MyInteger i = new MyInteger(5);  
increaseObject(i); 
+0

Ahh ..我完全忽略了後綴++部分。對不起,這是一個愚蠢的錯誤。 – rgamber

+0

@rgamber:沒問題,它會發生。 :) –

1

increasedObject2()功能,

返回的n ++;

它是後綴。因此,在n = 5返回之後,它增加n值,即n = 6。