2012-09-24 18 views
3

我意識到,如果我將一個對象作爲函數的參數傳遞並對其進行更改,則這些更改將保留在該對象中。但是整數不是這種情況。我可以修改「引用」整數變量嗎?

public void start() { 
    int x = 100; 
    modify(x); 
    // I would like x to be 200 now. But it isn't :(
} 

public void modify(int y) { 
    y *= 2; 
} 

所以基本上,有沒有辦法在上面的代碼中實現我想要的?是否有可能修改這樣的整數(如對象引用)?

回答

4

primitives一起工作時,沒有「reference」的概念。但是你可以通過做下面的事情來達到你想要的效果:

x = modify(x);可能是代碼想要的。

現在x包含方法調用的結果modify(x)

+0

不是我需要的代碼 - 但絕對是我需要的答案:) – Voldemort

+0

所有原語都有對象包裝。那麼爲什麼不使用Integer?整數x =新的整數(5); modify(x); –

+0

@AlexCalugarescu:所有包裝類都是不可變的。即使允許你按照你的建議去做,它也不過是額外的開銷。 – kosa

3

你不能那樣做。基元按值傳遞。 (。還提及按值傳遞的,不能修改一個對象引用,你只能修改被引用的對象),你能做的最好的是:

public void start() { 
    int [] x = {100}; 
    modify(x); 
    // x[0] is now 200 :) 
} 

public void modify(int []y) { 
    y[0] *= 2; 
} 

陣列基準x是按值傳遞,但是你可以修改數組元素。請注意,傳遞Integer將無濟於事,因爲Integer對象是不可變的。

或者,您可以重新設計您的方法以返回加倍的值並將其分配到調用代碼中(如Nambari suggests)。

0

你可以做的一件事就是獲取modify()方法的返回值並將其賦值給變量,如下所示。

public void start() { 
    int x = 100; 
    x=modify(x); 
} 

public int modify(int y) { 
    return y *= 2; 
} 
+2

不需要在'modify'中使用複合賦值;只是'返回y * 2;'。另外,這不僅僅是Nambari的答案? –

2

第三種可能性,passing an arrayusing a return value旁邊,將通過一些ValueHolder類的一個對象具有getter和setter:

public class IntValueHolder 
{ 
    private int value; 
    public int getValue() 
    { 
     return this.value; 
    } 
    public void setValue(final int value) 
    { 
     this.value = value; 
    } 
} 

這在技術上是非常類似於傳遞一個數組,但恕我直言,有點清潔,即它更好地描述你的意圖。