2009-01-28 21 views
11

我有一個關於更改Java中方法中變量值的問題。在方法中更改變量的值,Java

這是我的代碼:

public class Test { 
    public static void funk(int a, int[] b) { 
     b[0] = b[0] * 2; 
     a = b[0] + 5; 
    } 

    public static void main(String[] args) { 
     int bird = 10; 
     int[] tiger = {7}; 

     Test.funk(bird, tiger); 
    } 
} 

方法Test.funk(bird, tiger)執行後,鳥的價值沒有改變 - 它仍然具有價值10,即使在funk()方法我們已經改變了值與a = b[0] + 5;

在另一方面,在陣列的變化元素的值,因爲我們有說法b[0] = b[0] * 2;

我不明白爲什麼一件事情會改變,另一件事情不會改變?有人可以爲我解釋這一點。

回答

17

看看Jon Skeet的文章Parameter-Passing in Java,這解釋了這一點。

在短(看他的網站更全的解釋):

數組是引用類型。如果傳遞指向數組的引用,則會複製該引用的值並將其分配給該函數的參數。所以參數將指向與傳遞的參數相同的數組。因此,通過函數的參數對數組所做的更改將在調用函數中可見。但是,通過將參數(b)更改爲null,參數(b)不會被調用函數注意到,因爲參數(b)只是傳遞的參數(tiger)的副本。

整數是所謂的原始類型。傳遞整數複製其值並將其分配給參數。但是這個價值並不是對實際數據的參考,而是數據本身。因此,對函數中參數的更改將影響參數(a),但不會影響調用函數(bird)中傳遞的參數。

4

這是因爲當你聲明

public static void funk(int a, int[] b) 

變量的範圍僅僅是方法。那麼當你改變這個值的時候,你只是在改變變量的值的方法。

關於b。那是一個新的對象引用在主創建的同一個陣列,這就是爲什麼它似乎值不變化(變化的是下面的數組對象)

但試試這個:

public static void funk(int a, int[] b) { 
    // create a new reference for b 
    int[] c = new int[b.length]; 
    c[0] = b[0]; 
    b = c; 

    // The same. 
    b[0] = b[0] * 2; 
    a = b[0] + 5; 
} 

當你這樣做你會發現老虎的價值也沒有變化(只有在funk中創建的新數組c的內容)

您可以使用包裝器模擬通過ref傳遞。See this post.

雖然我還沒有得到有關只是爲了樂趣

編輯任何意見:

我修改代碼以使用上面貼包裝。

它看起來很奇怪,但看起來像它的作品。

// By ref simulated. 
public class Test { 

    public static void funk(_<Integer> a, int[] b) { 
     b[0] = b[0] * 2; 
     a.s( b[0] + 5) ; 
    } 

    public static void main(String[] args) { 
     _<Integer> bird = new _<Integer>(10); 
     int[] tiger = {7}; 

     Test.funk(bird , tiger); 

     System.out.println("bird = " + bird); 
     System.out.println("tiger = " + tiger[0]); 

    } 

} 

打印

bird = 19 
tiger = 14 

:-S

4

基本上,對象(如陣列)被傳遞到方法 「通過引用」。所以當你改變對象時,它會改變傳入方法的同一個對象。

基元(如int)的「按值傳遞」,讓您在一個賦值給變量是不一樣的傳遞英寸

我希望這有助於int變量.. 。

+1

不,它並不能幫助。 Java總是傳遞值。閱讀其他答案中提供的鏈接;你需要明白這一點。 – 2009-01-29 03:29:43