Java函数正在更新其输入变量

时间:2012-01-31 13:05:11

标签: java eclipse java-6

我正在做健身功能的实验室。问题是我正在制作一个SmallChange()函数来执行它所说的内容,令人烦恼的是它似乎更新了你给它的变量,而不应该这样做。

以下是完整课程的副本:https://gist.github.com/1710367

第38行是问题界线。

以下是功能。当我将solution作为输入时,它会更新solution并进行较小的更改,但我无法弄清楚如何或为什么。

任何人都知道我哪里出错了?它开始伤害我的大脑。

// Edits either the angle or velocity of our solution
// by a small amount (about 1% of the diffrence between max and min)
public static Double[] SmallChange(Double[] sol) {
    // Pick a 0 or 1
    switch (r.nextInt(2)) {
    case 1: // Changing the angle
        // The angle change amount
        Double angle = (angleLimits[1] - angleLimits[0]) * 0.01;

        // Make the change, either + or -
        if (r.nextInt(2) == 0) {
            sol[0] += angle;
        } else {
            sol[0] -= angle;
        }

        // Check it's within the limits
        if (sol[0] > angleLimits[1]) {
            sol[0] = angleLimits[1];
        } else if (sol[0] < angleLimits[0]) {
            sol[0] = angleLimits[1];
        }
        break;
    case 0: // Changing the velocity
        // The velocity change amount
        Double velocity = (velocityLimits[1] - velocityLimits[0]) * 0.01;

    // Make the change, either + or -
    if (r.nextInt(2) == 0) {
            sol[1] += velocity;
        } else {
            sol[1] -= velocity;
        }

    // Check it's within the limits
        if (sol[1] > velocityLimits[1]) {
            sol[1] = velocityLimits[1];
        } else if (sol[1] < velocityLimits[0]) {
            sol[1] = velocityLimits[1];
        }
        break;
    }

    return sol;
    }

1 个答案:

答案 0 :(得分:8)

在Java中,所有内容都是按值传递的 - 但该值始终是基元或引用。

因此,任何数组变量的值都是数组对象的引用。当您将该变量用作参数时,值(引用)最终将作为参数的初始值。它仍然将相同的数组 object 称为调用者的变量 - 因此调用者将看到对数组所做的任何更改。

所以只是为了澄清一下,你的陈述不正确:

  

恼人地似乎更新你给它的变量,当它不应该

它根本没有改变变量的值:调用代码中的变量仍具有与之前相同的值,即对同一数组的引用。只是该方法正在改变数组的内容。

这就像在一张纸上复制你的地址,然后把它交给某人:他们不能改变你住的地方,但他们可以改变你前门的颜色。


现在,解决问题......

如果要克隆数组,则必须明确地执行此操作。例如:

public static Double[] smallChange(Double[] sol) {
    Double[] ret = (Double[]) sol.clone();
    // Now work on ret instead of sol, and return ret at the end

可以重新分配给sol,但我个人不会。

请注意,您可能还想使用double[]代替Double[]