java - 为什么 Java 引用在这个程序中没有像预期的那样工作

标签 java reference matrix

我正在处理一个问题,我发现 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/

相关文章:

java - hibernate 模式 : how to get the current audited table name?

java - Android:对 findViewById 的引用

c++ - 关于 C++ 中的指针和引用的困惑

arrays - Matlab:带矩阵的 Arrayfun

arrays - 选择第一列值在列表中至少出现一次的行

java - 从 Hibernate 3.6 更新到 Hibernate 4.0

java - 接口(interface)编程——如何有效地访问调用类?

java - 为 Java 生成整数的随机数生成器

从列表中引用 igraph 的布局函数

c - 使用 malloc 创建二维和一维数组时出错