Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/375.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么Java引用不能像本程序中预期的那样工作_Java_Reference_Matrix - Fatal编程技术网

为什么Java引用不能像本程序中预期的那样工作

为什么Java引用不能像本程序中预期的那样工作,java,reference,matrix,Java,Reference,Matrix,我遇到了一个问题,我发现Java引用并没有像我期望的那样工作。当然,我是罪魁祸首:),有人能告诉我为什么会发生以下情况吗。让我先把代码贴在这里 package misc.matrix; public class ReferenceTester { public static void main(String args[]){ Boolean[][] input = { {true ,false ,true ,true ,false },

我遇到了一个问题,我发现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();
        }
    }
}
如果你看一下上面的程序,我想做的就是把数组中的所有值都改为true并打印出来。但它只是再次打印输入。 有人能告诉我这是为什么吗。最初我在程序中使用了基本布尔值,但由于我不想创建副本,所以我使用了包装布尔值类,它是一个Java对象,而不是基本值。(不是每个都是JAVA对象!?!?) 为什么在Java中会发生这种情况。为什么它没有打印所有的值以使其为真


请告知。

您不能在foreach循环中修改源对象。您的循环必须是如下循环的标准:

for(int i = 0; i < input.length; i++){ 
    for(int j = 0; j < input[i].length; j++){ 
        input[i][j] = true; 
    } 
}
for(inti=0;i
编辑:更准确地说,循环中的每个
都是指针,而不是引用;因此,将其设置为指向不同的值不会更改原始值


如果您希望单独确认这一点,foreach循环在幕后使用的确切形式已给出。

您的问题在于循环更改数组的值:

    for(Boolean[] eachRow:input){
        for(Boolean eachVal:eachRow){
            eachVal = Boolean.TRUE;
        }
    }
在每次迭代中,变量
eachVal
保存对数组单元格内容的引用,正如您所期望的那样。但问题是,由于
布尔值
是一种不可变的类型,也就是说,在创建
布尔值
对象后,您不能更改它的值,因此赋值不起作用。事实上,您实际正在做的是更改
eachVal
引用指向的对象。也就是说,由于
eachVal
是来自
input
eachRow
的自变量,因此您只需重新分配此变量,而不必接触数组的内容


如果您想让我进一步阐述或澄清某一点,请告诉我。

@mmyers得到了答案,您要求提供更多细节,但我无法将其纳入评论:

因此,您有一个对布尔值的引用数组(它始终是引用),并且在for-each循环中,您创建一个引用,该引用指向与该数组成员相同的布尔值

每次迭代引用都会更新为指向数组中下一个指针指向的对象

当您使用equals时,您只是简单地将引用重新分配给指向其他对象


如果您想更新数组中的对象,它必须是可变的(布尔值不是),并且您必须使用一个变数而不是等于。

您所尝试的与以下类似:

    int[] arr = { 1, 2, 3 };
    for (int i : arr) {
        i = 0;
    }

这不会将数组中的所有值都设置为0。Java按值传递所有内容。

原因是,我想foreach会静默地使用只读迭代器。@Paul:是的,但这不是原因。原因是,将迭代器中的
.next()
转换为临时值并不意味着您可以重新分配临时值,并期望原始数组或集合发生更改。(我知道你知道,但也许这也澄清了我的编辑。)谢谢。。知道了。。我以为所有的包装都不是一成不变的。。现在我明白了。谢谢Myers..@Bragaadesh:是的,如果布尔类有一个setValue(Boolean)方法,那么您可以在foreach循环中使用它来设置所有的值。但事实并非如此,因此您必须实际重新分配每个对象(现在也没有理由不使用原语)。我不理解这一行-您不能在创建布尔对象后更改其值。它不像绳子。还是这样?我可以这样做。布尔布尔布尔=null;布尔=真;布尔=假;我可以正确地更改布尔值。这里bool仍然是一个参考,不是吗?两点:
Boolean
是一种对象类型,
Boolean
是一种基本类型。当您使用对象类型创建变量时,该变量只保存对象的地址:它只是对对象的引用。因此,当你重新分配变量的值时,你实际上只是给它一个不同对象的地址。在内存中,
Boolean
对象将其值保存在
final
字段中:其值只能在初始化时设置。这有帮助吗?还是我误解了你的问题?你理解我,你说的话再也不能说服我了+1.