有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java在原语数组中重新分配数组值不会更改数组

我尝试用2个循环设置2D布尔数组的值,如下所示:

 boolean[][] frame = new boolean[10][4];
    for (boolean[] column : frame)
        for (boolean b : column)
            b = true;

但这似乎不起作用,所有的布尔人都是假的,为什么


共 (2) 个答案

  1. # 1 楼答案

    不能为数组中的对象指定新值,因为原始对象不会更改。下面的代码将完成此任务

    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将是真的。但是,数组中的元素仍然指向同一对象

    我希望这一点现在已经清楚了。图像会让它更容易理解

  2. # 2 楼答案

    因为您正在重新分配b,它是column[i]的副本,而不是column[i]本身。Java中的原语是(或者至少是“最好的想法”)通过值传递/复制的,而不是通过引用

    更准确地说,Java是引用的传递值,它抛弃了业余的“传递值”/“传递引用”二分法。对于原语,我不知道“严格地说”它们是否是值,但它们是不可变的,所以在这种情况下没有语义上的区别。e、 g

    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
          }
    }
    

    理解这些代码,你就会明白你的问题所在