布尔引用为null

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将分别为真/假.这与数组发生的情况相同,只是数组引用的命名方式不同.

  • Buzz杀死/纠正措辞时间.上面的代码确实改变了`a`和`b`指向的对象.但是,它不会更改从`a`和`b`(`null`)复制的数组元素引用的对象. (3认同)
  • @SotiriosDelimanolis正在思考它,它实际上只是语言模糊(更好地澄清而不是).如果我做`a.change()`,我可以说:'我改变了指向`的对象.如果我做`a = new Object();`,我可以说:'我改变了指向`的对象.只是一个人正在谈论参考,另一个是谈论对象. (3认同)

Ram*_*oza 8

你必须在分配之前初始化你的布尔值.

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.


Two*_*The 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); 
Run Code Online (Sandbox Code Playgroud)

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

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