2015-05-29 39 views
1

簡而言之,我將一個參數傳遞給一個方法,將該方法的輸出分配給一個不同的變量,並稍後引用原始參數,僅發現它的值已更改!Android:Java方法調用更改輸入參數

這裏我有創建原始變量的主要片段的相關部分。這是logtag是QF:

Log.d("QF",""+ roiRGB[0]); 
double[] lab = MathUtils.rgbTOlab(roiRGB, refRGB); 
Log.d("QF",""+ roiRGB[0]); 

在MathUtils,rgbTOlab看起來是這樣的:

public static double[] rgbTOlab(double[] roi, double[] ref){ 
    double[] newroi = roi; 
    Log.d("rgbTOlab", roi[0] + " vs " + newroi[0]); 
    newroi = rgbTOxyz(newroi); 
    Log.d("rgbTOlab", roi[0] + " vs " + newroi[0]); 
    ... 

而且rgbTOxyz看起來是這樣的:

public static double[] rgbTOxyz(double[] rgb) 
{ // RGB input values must be normalized to 0..1 
    Log.d("rgbTOxyz",rgb[0]+""); 
    double[] newrgb = rgb; 
    Log.d("rgbTOxyz",rgb[0]+ " vs " + newrgb[0]); 
    // Convert RGB values to sRGB ("standard" RGB) 
    for (int i=0;i<3;i++) { 
     if (rgb[i] <= 0.04045) { 
      rgb[i] = rgb[i]/12.92; 
     } else { 
      rgb[i] = Math.pow((rgb[i] + 0.055)/1.055, 2.4); 
     } 
     rgb[i] = rgb[i] * 100; 
    } 
    Log.d("rgbTOxyz",rgb[0]+" vs " + newrgb[0]); 
    ... 

而這裏的logcat的:

05-28 19:42:29.961 D/QF﹕ 0.16626617647060205 
05-28 19:42:29.962 D/rgbTOlab﹕ 0.16626617647060205 vs 0.16626617647060205 
05-28 19:42:29.962 D/rgbTOxyz﹕ 0.16626617647060205 
05-28 19:42:29.962 D/rgbTOxyz﹕ 0.16626617647060205 vs 0.16626617647060205 
05-28 19:42:29.962 D/rgbTOxyz﹕ 2.354995989041693 vs 2.354995989041693 
05-28 19:42:29.962 D/rgbTOlab﹕ 2.354995989041693 vs 2.036417989802886 
05-28 19:42:29.962 D/QF﹕ 2.354995989041693 

rgb [0] s的值我永遠不會改變,我需要它在方法調用之前和之後都是一樣的。然而,顯然,即使我從不操縱它或將其返回,最初的觀點也正在發生變化。關於爲什麼會發生這種情況的任何想法,以及我如何解決它?我完全失去了,非常感謝任何幫助。

+0

你是不是想要克隆'roi'? 'double [] newroi = roi'聲明對double []的引用,並初始化它指向與'roi'指向的相同數組。 –

回答

1

將原始類型的數組傳遞給函數時,它的作用方式與對象相同:對數組的引用將被傳遞,而不是直接傳遞值,因爲對於單個基本值,情況就是這樣。欲瞭解更多信息,請致電see this question

這意味着,如果您更改了函數內部的數組,它將會在原始數組的內存塊上發生,這也會有效地改變原始數組。 roi,newroinewrgb都指向代碼中的相同內存塊。

要解決此問題,您必須顯式複製數組,不僅將引用分配給新變量。看看這個方法:Arrays.copyOf()

+0

謝謝,修復它。我刪除了該顯式副本,而是將該數組的副本作爲原始參數傳遞。我已經閱讀了變量是如何傳遞的,但我沒有意識到數組是對象,因此對待方式不同。 – JinjerJohn

0

此行double[] newroi = roi;不創建一個新的陣列,兩個變量指向同一個數組,所以如果你修改newroi[0]roi[0]也將被修改。

您應該使用Arrays.copyOf()Object.clone()來代替。

+0

謝謝,我使用了數組方法。是否有理由做一個對另一個? – JinjerJohn