Stu*_*ion 13 java autoboxing boolean
任何人都可以解释为什么这个代码导致下面的输出?
@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);
}
}
Run Code Online (Sandbox Code Playgroud)
结果:
null
null
Run Code Online (Sandbox Code Playgroud)
数组ab是否应保存指向对象a和对象b的指针,因此输出:
true
false
Run Code Online (Sandbox Code Playgroud)
Cru*_*her 21
a = new Boolean(true);
b = new Boolean(false);
Run Code Online (Sandbox Code Playgroud)
这不会更改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);
Run Code Online (Sandbox Code Playgroud)
c和d将分别为真/假.这与数组发生的情况相同,只是数组引用的命名方式不同.
你必须在分配之前初始化你的布尔值.
Boolean[] ab = new Boolean[]{a, b};
a = new Boolean(true);
b = new Boolean(false);
Run Code Online (Sandbox Code Playgroud)
至
a = new Boolean(true);
b = new Boolean(false);
Boolean[] ab = new Boolean[]{a, b};
Run Code Online (Sandbox Code Playgroud)
这是在使用Objects之前,您将对该对象的引用复制,并使用new语句创建一个新对象,第一个a,b在分配时为null.
您的代码已展开:
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);
Run Code Online (Sandbox Code Playgroud)
将名为a和b的变量的内容复制到数组的那一刻,它被设置为null.按值复制和按引用复制有重要区别.
作为旁注:建议使用Boolean.TRUE或至少使用Boolean.valueOf(true),以避免不必要的对象创建.布尔值没有那么多选项,布尔值是不可变的.
| 归档时间: |
|
| 查看次数: |
1096 次 |
| 最近记录: |