2017-03-06 22 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