2017-03-06 37 views
1

我的一個名爲Board的類中有以下方法。董事會有120個廣場,這是我的程序中的另一個類。值在數組中沒有正確更改

public class Board{ 

private Square[] square = new Square[120]; 
... 

每個Square都有一個int行和一個int列。

public class Square extends JButton{ 
public int row; 
public int column; 
... 

的方法本身是應該弄清楚的行和列是每平方里面

void setSquares() { 
    int ones; 
    int tenths; 
    Square s = new Square(); 
    Insets squareMargin = new Insets(5, 5, 5, 5); 
    s.setMargin(squareMargin); 
    for (int i = 0; i < square.length; i++){ 

     ones = getNdigit(i, 1); 
     tenths = getNdigit(i, 2); 

     //set row && set column 
     if ((tenths >= 2 && tenths <= 9) && (ones >= 1 && ones <= 8)){ 
      s.row = tenths - 1; 
      s.column = ones; 

     } else{ 
      s.row = 0; 
      s.column = 0; 
     } 
     square[i] = s; 
     System.out.println(square[0].toString()); 

    } 

所以,在方法的結尾,我希望多[34]有一個排爲2,列爲4.但是,實際結果總是與for循環結束處相同(square [34]的行和列爲0)。 如果for循環改變爲

for (int i = 0; i < 55; i++){ 

然後平方[34]具有4行和4。

+0

1.您忘記提問了。 2.什麼值不能正確改變?提供樣本輸入和輸出(預期和實際收到) – UnholySheep

+0

int和列的值沒有正確更改,我的問題是爲什麼。我在最後一段提供了示例數據。 – Snow

回答

2

您正在創建的Square只有一個實例,並使用它在整個for循環的列。移動for循環內的實例化,因此每個存儲的實例都會有所不同。

要回答你的問題的評論:

Square s = new Square(); 

在中分配一些內存空間來存儲Square實例(在這裏你可以設定值,它的成員)。所以現在s引用內存中的空間。

square[i] = s; 

所以現在square[i]引用相同的空間(從而具有相同的部件值)。因此每所有square[i]引用到同一地點(Square的同一個實例)。但是,如果您每次迭代分配s一次,那麼s將引用一個新正方形,並且每個square[i]將引用一個不同的Square實例

+0

這就是我需要做的。我很驚訝。如果我問爲什麼會發生這種情況,你介意嗎? s的值在每個循環中都會改變,爲什麼square [i]會隨之改變? – Snow

+0

@Snow看看編輯回答你的問題 – giorashc

+0

現在這很有道理。現在我已經把頭撞在牆上好幾個小時了,而你剛剛進來就像一劑Vicodin。我無法感恩。 – Snow