Android:Java方法调用更改输入参数

时间:2015-05-29 02:06:56

标签: java android

简而言之,我将一个参数传递给一个方法,将方法的输出分配给另一个变量,然后引用原始参数,只是发现它的值已经改变了! / 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]的值永远不会改变,我需要它在该方法调用之前和之后是相同的。然而很明显,即使我从未操纵或返回它,原始论点也会被改变。关于为什么会发生这种情况的任何想法,以及我如何解决它?我完全失去了帮助,非常感谢。

2 个答案:

答案 0 :(得分:1)

当您将基本类型的数组传递给函数时,它的工作方式与对象的工作方式相同:将传递对数组的引用,而不是直接传递值,就像单个基元值的情况一样。有关更多信息,see this question

这意味着,如果像你一样更改函数内部的数组,它将发生在原始数组的内存块上,实际上也会更改原始数组。 roinewroinewrgb都指向代码中的相同内存块。

要解决此问题,您必须显式复制数组,而不仅仅是将引用分配给新变量。看看这个方法:Arrays.copyOf()

答案 1 :(得分:0)

此行double[] newroi = roi;不会创建新数组,两个变量都引用相同的数组,因此如果您修改newroi[0]roi[0]也会被修改。

您应该使用Arrays.copyOf()Object.clone()代替。