首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Android: Java方法调用更改输入参数

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

Stack Overflow用户
提问于 2015-05-29 02:06:56
回答 2查看 65关注 0票数 1

简而言之,我将一个参数传递给一个方法,将方法的输出分配给一个不同的变量,然后引用原始参数,结果发现它的值已经改变了!

这里我有创建原始变量的主片段的相关部分。它的逻辑标签是QF:

代码语言:javascript
复制
Log.d("QF",""+ roiRGB[0]);
double[] lab = MathUtils.rgbTOlab(roiRGB, refRGB);
Log.d("QF",""+ roiRGB[0]);

在MathUtils中,rgbTOlab看起来如下所示:

代码语言:javascript
复制
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看起来是这样的:

代码语言:javascript
复制
    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]);
    ...

这是一只逻辑猫:

代码语言:javascript
复制
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的值不应该改变,我需要它在那个方法调用之前和之后是相同的。然而,很明显,原来的论点正在被改变,即使我从来没有操纵它或返回它。对为什么会发生这种事,我有什么想法,我怎么能解决?我完全迷路了,任何帮助都是非常感谢的。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-05-29 02:13:41

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

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

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

票数 1
EN

Stack Overflow用户

发布于 2015-05-29 02:15:31

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30519991

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档