我正在处理一个问题,我发现 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 类,它是一个 Java 对象而不是原始值。 (eachVal 不是一个 JAVA 对象吗!?!?!?!?) 为什么在 Java 中会发生这种情况。为什么它不打印所有值为真?
请指教。
最佳答案
您不能在 foreach 循环中修改源对象。您的循环必须是这样的标准 for 循环:
for(int i = 0; i < input.length; i++){
for(int j = 0; j < input[i].length; j++){
input[i][j] = true;
}
}
编辑:更准确地说,循环中的eachVal
是一个指针,而不是引用;因此将其设置为指向不同的值不会更改原始值。
foreach 循环在幕后使用的确切形式已给出 here , 如果您想独立确认这一点。
关于java - 为什么 Java 引用在这个程序中没有像预期的那样工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2291065/