2013-03-01 27 views
2

我嘗試使用2個迴路這樣設置2D布爾數組的值:重新分配數組的值不會改變陣列

boolean[][] frame = new boolean[10][4]; 
    for (boolean[] column : frame) 
     for (boolean b : column) 
      b = true; 

但這似乎沒有工作,所有布爾保持假的,爲什麼?

+2

'b'是循環中的局部變量。改變它的值不會影響數組內容。 – jlordo 2013-03-01 15:56:04

回答

6

您不能將新值分配給數組中的對象,因爲原始對象不會被更改。下面的代碼將做的伎倆。更

boolean[][] frame = new boolean[10][4]; 
for (boolean[] column : frame) 
    for (int i = 0; i < column.length; i++) 
     column[i] = true; 

的位解釋:

該數組包含元件,其指向布爾值。當您將數組的其中一個元素的值分配給名爲b的變量(for (boolean b : column))時,變量b將指向數組中元素指向的同一對象。接下來,您將變量b指向true。現在,b將是真實的。但是,數組中的元素仍然指向同一個對象。

我希望現在已經清楚。一個圖像會使它更容易理解...

+3

你能解釋爲什麼OP的代碼不起作用嗎? – christopher 2013-03-01 15:55:12

+0

該死的,我應該猜到b只能是一個副本而不是對象本身,謝謝你解釋 – 2013-03-01 16:41:30

4

因爲您正在重新指定b這是column[i]的副本,而不是column[i]本身。 Java中的基元是(或至少是「最好想到的」)通過/複製的值,而不是通過引用。

更確切地說,Java是通過引用值傳遞的,它拋出了業餘的「按值傳遞」/「通過引用傳遞」二分法。對於基元,我不知道「嚴格地說」它們是有價值的,但它們是不可變的,所以在這種情況下沒有語義上的區別。例如

public class Foo { 
     public int x; 

     public static void main(String args[]) { 
      Foo a = new Foo(); 
      Foo b = a; 
      Foo c = new Foo(); 
      a.x = 1; //b.x is now 1 
      b.x = 2; //a.x is now 2 
      a = c; 
      a.x = 3; //b.x is still 2 because a's reference changed 
     } 
} 

瞭解該代碼,您將瞭解與您的問題。

+0

即使是(SomeObject b:column)它也行不通。問題不在於它是原始的,而是改變變量指向的內容不會改變數組指向的內容。 – Herms 2013-03-01 15:57:54

+0

是「b.x = 2; //a.x現在是2」真的如此嗎? 我認爲「a.x現在是2」只適用於你,如果你另外設置「a = b」 – 2013-03-01 16:46:19

+0

@Big_Chair它是正確的。參考實際上並不指向對方。每當你閱讀「left = right」時,這實際上意味着「left = right的對象」。所以'b = a'意味着'b = a's Foo',所以當調用b.x = 2時,它意味着'(a's Foo).x = 2'。 – djechlin 2013-03-01 17:09:03