2015-06-25 138 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()'填充該引用。 –