任何人都可以解释为什么这段代码导致以下输出?
@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
答案 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)
我认为将数组元素可视化为指针是有帮助的。
我们首先创建两个指针a
和b
,两者都指向null。
Boolean a = null, b = null;
接下来,我们再创建两个指针ab[0]
和ab[1]
,并将它们指向与a
和b
相同的位置。也就是null
。
Boolean[] ab = new Boolean[]{a, b};
然后,我们创建新的布尔true
和false
对象(包含语句的new Boolean(true)
和new Boolean(false)
部分。)
最后,我们让a
和b
指向他们。
a = new Boolean(true);
b = new Boolean(false);
当你以这种方式看待它时,我认为更清楚为什么更改a
和b
对数组没有影响。
答案 4 :(得分: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);
}
}