Java函数参数值正在更改

时间:2012-01-31 20:55:47

标签: java function parameters pass-by-reference pass-by-value

我写了一个函数。问题是,我正在发送的参数正在主程序中被操纵,尽管这不是我的意图。我只想在函数中包含值,但在运行时,主程序中的实际值也会被更改。

我该如何防止这种情况?

这是我的代码:

    Tiles[][] MoveRight(Tiles[][] tilesArray) {


    Tiles[][] tempTilesArray = new Tiles[3][3];
    Tiles[][] tempTilesArrayToSend = new Tiles[3][3];

    tempTilesArrayToSend = CopyTilesArrays(tilesArray, tempTilesArrayToSend);

    ArrayIndex zeroPos = FindZero(tilesArray);

    Tiles zeroTile = GetTile(zeroPos, tilesArray);

    if (zeroPos.column != 2) {
        ArrayIndex otherPos = new ArrayIndex(zeroPos.row,
                zeroPos.column + 1);
        tempTilesArray = SwapTilesPositions(zeroTile, GetTile(otherPos,
                tilesArray), tempTilesArrayToSend);
    }
    return tempTilesArray;

}

我在SwapPositionFunction内发送的数组实际上正在修改tilesArray本身。虽然我已经创建了一个新的tiles数组实例然后发送它。

1 个答案:

答案 0 :(得分:1)

没有看到

中做了什么
CopyTilesArrays (tilesArray, tempTilesArrayToSend);
我们不能说太多。

请注意,在Java中,没有传值或传递引用,但引用的副本将传递给方法。这个引用的副本 - 如果是对象和数组 - 指向相同的原始对象,所以如果更改底层/嵌入对象,原始对象会受到影响,但是如果更改引用,则原始对象不会影响。

如果要传递阵列的独立副本,则必须执行深度ocpy。也许就是说,CopyTilesArrays应该做什么,但没有看到它,我们不知道。

另外请注意,有或更好:可能有多个对象层,有不同的理由留在表面,去核心,或留在两者之间。

例如,要从“数组数组”中制作深层副本,您可以执行以下操作:

public class TilesCopy {
    Tiles[][] copyTilesArrays (Tiles[][] from, int outer, int inner) {
        Tiles[][] to = new Tiles[outer][inner];
        int o = 0;
        for (Tiles [] tiles: from) {
            Tiles[] fresh = new Tiles [inner];
            int i = 0;
            for (Tiles t : tiles) 
            {
                fresh[i] = t.deepCopy ();
                i++;
            }
            to [o] = fresh; 
            o++;
        }
        return to; 
    }
}

请注意,在最里面的循环中,元素不仅仅使用fresh[i] = t;引用,而是使用深层副本,以保持原始数组中的对象不受影响。

您可以通过多种其他方式复制Tiles数组。例如,您可以重新排列外部数组。如果瓷砖是

[[A][B][C]]
[[D][E][F]]
[[G][H][I]]

您可以复制它们,并将目标修改为:

[[G][H][I]]
[[D][E][F]]
[[A][B][C]]

只需复制外部数组,然后重新排列它们。你可以复制内部数组:

[[C][B][A]]
[[F][E][D]]
[[I][H][G]]

如果您现在将A修改为a,原始A也会受到影响,没有深层复制:

[[C][B][a]]
[[F][E][D]]
[[I][H][G]]

[[a][B][C]]
[[D][E][F]]
[[G][H][I]]