[英]Why is Java reference is not working like expected in this Program
我正在解決一個問題,我發現Java引用並沒有像我期望的那樣工作。 當然,我是罪魁禍首:),有人可以請我為什么以下情況發生。 我先在這里發布代碼。
package misc.matrix;
public class ReferenceTester {
public static void main(String args[]){
Boolean[][] input = {
{true ,false ,true ,true ,false },
{false ,true ,true ,true ,true },
{true ,true ,true ,true ,true },
{true ,true ,true ,true ,true },
{true ,false ,true ,true ,true }
};
print(input);
for(Boolean[] eachRow:input){
for(Boolean eachVal:eachRow){
eachVal = Boolean.TRUE;
}
}
print(input);
/*Expected output
true true true true true
true true true true true
true true true true true
true true true true true
true true true true true
*/
}
/**
* Simply prints the array
*/
private static void print(Boolean[][] input) {
for(Boolean[] outArray:input){
for(Boolean iVal:outArray){
System.out.print(iVal?iVal+" ":iVal+" ");
}
System.out.println();
}
}
}
如果您看一下上面的程序,我想要做的就是將Array中的所有值更改為true並打印它。 但它只是再次打印輸入。 有人可以告訴我為什么會這樣。 最初我在程序中使用了原始boolean,但由於我不想創建副本,我使用了包裝器Boolean Class,它是一個Java OBJECT而不是原語。 (Isnt eachVal是一個JAVA OBJECT!?!?!?!?)為什么會在Java中發生這種情況。 為什么不打印所有值都是真的?
請指教。
您無法在foreach循環中修改源對象。 你的循環必須是這樣的循環標准:
for(int i = 0; i < input.length; i++){
for(int j = 0; j < input[i].length; j++){
input[i][j] = true;
}
}
編輯:更確切地說,循環中的eachVal
是一個指針 ,而不是一個引用; 因此將其設置為指向不同的值不會更改原始值。
如果您希望單獨確認,則此處給出了foreach循環在幕后使用的確切形式。
你的問題是循環改變數組的值:
for(Boolean[] eachRow:input){
for(Boolean eachVal:eachRow){
eachVal = Boolean.TRUE;
}
}
在每次迭代中,變量eachVal
保存對數組單元格內容的引用,正如您所期望的那樣。 但問題是,因為Boolean
是一個不可變類型 - 也就是說,你不能在創建Boolean
對象后改變它的值 - 你的賦值不起作用。 實際上,您實際在做的是更改eachVal
引用所指向的對象。 也就是說,因為eachVal
是一個來自input
和eachRow
的獨立變量,所以你只需重新分配這個變量而不必觸及數組的內容。
如果您希望我擴展或澄清任何特定點,請告訴我。
@mmyers得到了答案,你要求更多細節,但我無法在評論中說明:
所以你有一個對booleans的引用數組(它是ALWAYS引用),並且在你的每個循環中你創建一個引用,指向與該數組成員相同的布爾值。
每次迭代都會更新引用以指向數組中的下一個指針指向的內容。
當您使用equals時,您只需重新指定引用以指向其他內容。
如果你想更新數組中的對象,它必須是可變的(布爾不是),你必須使用mutator而不是equals。
您嘗試的是類似於以下內容:
int[] arr = { 1, 2, 3 };
for (int i : arr) {
i = 0;
}
這不會將數組中的所有值都設置為0. Java會按值傳遞所有內容。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.