布尔引用为null

时间:2013-10-15 15:58:24

标签: java boolean autoboxing

任何人都可以解释为什么这段代码导致以下输出?

@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

5 个答案:

答案 0 :(得分: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将分别为真/假。这与数组发生的情况完全相同,只是数组引用的命名方式不同。

答案 1 :(得分: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在分配时为null。

答案 2 :(得分: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),以避免不必要的对象创建。布尔值没有那么多选项,布尔值是不可变

答案 3 :(得分:4)

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

我们首先创建两个指针ab,两者都指向null。

Boolean a = null, b = null;

Pointers a and b point to null

接下来,我们再创建两个指针ab[0]ab[1],并将它们指向与ab相同的位置。也就是null

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

All four pointers point to null

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

Two new Booleans have been created

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

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

a and b point to the new Booleans

当你以这种方式看待它时,我认为更清楚为什么更改ab对数组没有影响。

答案 4 :(得分:3)

......这绝对正常。您正在初始化值,但是,顺序来说,ab仍然是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);
    }
}