我嘗試使用2個迴路這樣設置2D布爾數組的值:重新分配數組的值不會改變陣列
boolean[][] frame = new boolean[10][4];
for (boolean[] column : frame)
for (boolean b : column)
b = true;
但這似乎沒有工作,所有布爾保持假的,爲什麼?
我嘗試使用2個迴路這樣設置2D布爾數組的值:重新分配數組的值不會改變陣列
boolean[][] frame = new boolean[10][4];
for (boolean[] column : frame)
for (boolean b : column)
b = true;
但這似乎沒有工作,所有布爾保持假的,爲什麼?
您不能將新值分配給數組中的對象,因爲原始對象不會被更改。下面的代碼將做的伎倆。更
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將是真實的。但是,數組中的元素仍然指向同一個對象。
我希望現在已經清楚。一個圖像會使它更容易理解...
你能解釋爲什麼OP的代碼不起作用嗎? – christopher 2013-03-01 15:55:12
該死的,我應該猜到b只能是一個副本而不是對象本身,謝謝你解釋 – 2013-03-01 16:41:30
因爲您正在重新指定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
}
}
瞭解該代碼,您將瞭解與您的問題。
即使是(SomeObject b:column)它也行不通。問題不在於它是原始的,而是改變變量指向的內容不會改變數組指向的內容。 – Herms 2013-03-01 15:57:54
是「b.x = 2; //a.x現在是2」真的如此嗎? 我認爲「a.x現在是2」只適用於你,如果你另外設置「a = b」 – 2013-03-01 16:46:19
@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
'b'是循環中的局部變量。改變它的值不會影響數組內容。 – jlordo 2013-03-01 15:56:04