13

谁能解释为什么这段代码会导致以下输出?

@Test
public void testBooleanArray() {
    Boolean[] ab = new Boolean[]{a, b};

    a = new Boolean(true);
    b = new Boolean(false);

    for(Boolean x : ab) {
        System.out.println(x);
    }
}

结果:

null
null

如果数组 ab 不包含指向对象 a 和对象 b 的指针,则输出:

true
false
4

5 回答 5

21
a = new Boolean(true);
b = new Boolean(false);

这不会改变 a 和 b 指向的对象(数组中的元素)。它将它们指向new对象。

它没有修改数组

为了显示:

Boolean a = new Boolean(true);
Boolean b = new Boolean(false);
Boolean c = a;
Boolean d = b;
a = new Boolean(false);
b = new Boolean(true);

c 和 d 仍将分别为真/假。这与数组发生的事情相同,只是您的数组引用的命名方式不同。

于 2013-10-15T15:59:39.160 回答
8

您必须在分配布尔值之前对其进行初始化。

Boolean[] ab = new Boolean[]{a, b};

a = new Boolean(true);
b = new Boolean(false);

a = new Boolean(true);
b = new Boolean(false);

Boolean[] ab = new Boolean[]{a, b};

这是在使用 Objects 之前,您复制对对象的引用,并使用 new 语句创建一个新对象,分配时第一个 a,b 为空。

于 2013-10-15T16:00:44.637 回答
6

您的代码展开:

Boolean a = null;
Boolean b = null;
Boolean[] ab = new Boolean[2];
ab[0] = a;
ab[1] = b;

a = new Boolean(true); 
b = new Boolean(false); 

将名为 a 和 b 的变量的内容复制到数组的那一刻,它被设置为 null。按值复制和按引用复制有一个重要区别。

作为旁注:建议使用 Boolean.TRUE 代替或至少使用 Boolean.valueOf(true),以避免不必要的对象创建。布尔值没有那么多选项,而布尔值是不可变的。

于 2013-10-15T16:43:02.110 回答
4

我认为将数组元素可视化为指针很有帮助。

我们首先创建两个指针,ab,都指向空值。

Boolean a = null, b = null;

指针 a 和 b 指向 null

接下来,我们再创建两个指针ab[0]and ,并将它们指向与andab[1]相同的位置。即,。abnull

Boolean[] ab = new Boolean[]{a, b};

所有四个指针都指向空

然后,我们创建新的布尔值truefalse对象(使用语句的new Boolean(true)new Boolean(false)部分)。

已创建两个新的布尔值

最后,我们让ab指向它们。

a = new Boolean(true);
b = new Boolean(false);

a 和 b 指向新的布尔值

当您这样看时,我认为更清楚为什么要更改a并且b对数组没有影响。

于 2013-10-16T01:35:48.450 回答
3

...这绝对是正常的。您正在初始化值,但按顺序来说,a并且b仍然null在过程开始分配变量之前。放置的不是变量,而是它们的值或引用作为数组中的元素。

@Test
public void testBooleanArray() {
    /* We have a Boolean array, Boolean being able to hold a true, false but
    also a null as an object */
    Boolean[] ab = new Boolean[]{a, b}; /* We initialize the array with the variables
    here but ... */

    a = new Boolean(true); // ... the instances are only set at this stage
    b = new Boolean(false); /* Plus, even if Boolean is immutable, the use of new
    will actually create new objects */

    for(Boolean x : ab) {
        System.out.println(x);
    }
}   
于 2013-10-15T16:05:45.220 回答