简而言之,我将一个参数传递给一个方法,将方法的输出分配给一个不同的变量,然后引用原始参数,结果发现它的值已经改变了!
这里我有创建原始变量的主片段的相关部分。它的逻辑标签是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]);
...这是一只逻辑猫:
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.354995989041693rgb的值不应该改变,我需要它在那个方法调用之前和之后是相同的。然而,很明显,原来的论点正在被改变,即使我从来没有操纵它或返回它。对为什么会发生这种事,我有什么想法,我怎么能解决?我完全迷路了,任何帮助都是非常感谢的。
发布于 2015-05-29 02:13:41
当将基元类型数组传递给函数时,它的工作方式与对象相同:对数组的引用将被传递,而不是直接传递值,就像对单个基元值的引用一样。想了解更多信息,see this question。
这意味着,如果您像以前一样更改函数中的数组,那么它将发生在原始数组的内存块上,实际上也会更改原始数组。roi、newroi和newrgb都指向代码中的同一个内存块。
要解决这个问题,您必须显式地复制数组,而不仅仅是将引用赋值给一个新变量。查看此方法:Arrays.copyOf()。
发布于 2015-05-29 02:15:31
这行double[] newroi = roi;不会创建一个新的数组,两个变量都引用同一个数组,所以如果修改newroi[0],roi[0]也会被修改。
您应该使用Arrays.copyOf()或Object.clone()。
https://stackoverflow.com/questions/30519991
复制相似问题