我有一个称为“ playingField”的2D数组。在进行任何更改之前,我制作一个tempField 2D数组并设置tempField = playingField。

经过几次修改,所有修改都起作用了,我在代码中看到了这一点:

else {
//at this point both playingField and tempField are unchanged still
    boundsNormal = bounds.OutOfBounds(move.MovePlayer(playingField,trekker, direction, rowT, colT));
    if(boundsNormal == true){
//for some reason, at this point, tempField gets reassigned to the new playingField (which I'm still not sure why *THAT* changes)
        playingField = tempField;


MovePlayer是一种方法,用于修改其需要的2D数组(在本例中为playingField),并且OutOfBounds在给定数组的情况下返回true或false。

我也许能理解为什么playingField会被更改,但不知道为什么在初始化boundsNormal变量后tempField应该经历任何更改。

最佳答案

我制作了一个tempField 2D数组并设置了tempField = playingField。


你说的话没有道理。您正在创建一个名为tempField的数组变量,但如果这样做

tempField = playingField


那么两个变量现在都指向同一个数组。因此它们都被更改了,因为它们是同一数组。

为避免这种情况,通常可以使用System.arrayCopy代替=。但是,对于二维数组,“深度复制”要复杂一些,因为您有一个数组数组。

(注意:更一般而言,当对象是可变的时,可能需要对它们进行“深度复制”或“深度克隆”,而不是使用=来避免此问题。数组只是该一般规则的一个示例。)

07-24 05:23