简而言之,我将一个参数传递给一个方法,将方法的输出分配给另一个变量,然后引用原始参数,只是发现它的值已经改变了! / p>
这里我有主片段的相关部分,它创建了原始变量。它的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]的值永远不会改变,我需要它在该方法调用之前和之后是相同的。然而很明显,即使我从未操纵或返回它,原始论点也会被改变。关于为什么会发生这种情况的任何想法,以及我如何解决它?我完全失去了帮助,非常感谢。
答案 0 :(得分:1)
当您将基本类型的数组传递给函数时,它的工作方式与对象的工作方式相同:将传递对数组的引用,而不是直接传递值,就像单个基元值的情况一样。有关更多信息,see this question。
这意味着,如果像你一样更改函数内部的数组,它将发生在原始数组的内存块上,实际上也会更改原始数组。 roi
,newroi
和newrgb
都指向代码中的相同内存块。
要解决此问题,您必须显式复制数组,而不仅仅是将引用分配给新变量。看看这个方法:Arrays.copyOf()
。
答案 1 :(得分:0)
此行double[] newroi = roi;
不会创建新数组,两个变量都引用相同的数组,因此如果您修改newroi[0]
,roi[0]
也会被修改。
您应该使用Arrays.copyOf()
或Object.clone()
代替。