我有一个名为“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。
我可以理解为什么playField被改变了,但是在初始化boundsNormal变量之后我不知道为什么tempField应该经历任何改变。
答案 0 :(得分:2)
我制作一个tempField 2D数组并设置tempField = playingField。
你说的话没有意义。您正在创建一个名为tempField
的数组变量,但如果您这样做
tempField = playingField
然后两个变量现在都指向同一个数组。所以它们都被改变了,因为它们是相同的阵列。
为避免这种情况,您通常可以使用System.arrayCopy
代替=
。但是,对于二维数组来说,“深度复制”它会有点复杂,因为你有一个数组数组。
(注意:更一般地说,当对象是可变的时,你可能需要“深度复制”或“深度克隆”它们而不是使用=
,以避免这个问题。数组只是这个例子的一个例子。规则。)
答案 1 :(得分:0)
playingField = tempField;
这行代码不会复制您的数组,它会复制引用。在此赋值之后,playingField
和tempField
表示内存中的相同数组(在此之前可能等待垃圾收集的playField数组。)因此,如果在此之后您更改了数组中的任何内容由playingField
表示,更改也将在tempField
中显示,因为它现在基本上是相同的数组(未复制的数组,只是具有两个名称的相同数组)。