2015-06-25 188 views
2

目标是一些瓷砖的对象和自定义属性复制到一个2D阵列,但是我有意想不到的效果:编辑字段

for (int i = 0; i<3; i++) 
    { 
     for (int j = 0; j<3; j++) 
     { 
      TileList[i][j] = Tiles[3]; 
      //the goal is the overwrite the MapX and MapY fields of each element of the new Array 
      TileList[i][j].MapX = i; 
      TileList[i][j].MapY = j; 
     } 
    } 

打印出值中的每个元件的每个的MapX后和每个元素的MapY字段都有自己独立的值,但是对于2d阵列中的每个tile对象引用,MapX和MapY都设置为3。

回答

3

你所有阵列成员设置与此语句相同的对象:

TileList[i][j] = Tiles[3]; 

这种说法拷贝的对象引用,而不是对象本身。

在最后一次循环,所有阵列成员指向同一个对象,这些报表的成员设置为3和3:

TileList[i][j].MapX = i; 
    TileList[i][j].MapY = j; 

如果你想所有阵列成员为指向不同对象,你可以为每个新对象有一个默认的构造:

TileList[i][j] = new Tile(); 

或者一个构造函数,拷贝另一个对象:

TileList[i][j] = new Tile(myDefaultTile); 

还是clone()方法,如果你支持它:

TileList[i][j] = myDefaultTile.clone(); 

顺便说一句,请注意,这是习惯在Java中的变量和类成员的名字,开始以小写字母。例如:

tileList[i][j].mapX = i; 
+0

您的解决方案工作,这带来了另一个问题,为什么有必要使用瓷砖[] [] TileList =新瓷砖[] [];在循环之前实例化,起初它没有工作,并且得到一个空指针豁免,直到我使用上述语句 – hec

+0

您必须先创建数组,然后才能将其放入。创建矩形二维数组的最简单方法是在前面指定两个维度 - 例如'Tile [] [] tileList = new Tile [3] [3]'。这将创建一个包含空引用的数组,您可以使用'new Tile()'填充该引用。 –