以下代码打印为true。
public static void main(String[] args) {
Boolean test = false;
test = true;
System.out.println(test);
如果布尔值在Java中是不可变的,我怎样才能将测试从false更改为true?它不应该给我一个错误吗?
答案 0 :(得分:3)
混乱是因为自动拳击。代码应该读取为
Boolean test = new Boolean(false);
test = new Boolean(true);
因此,您正在更改引用测试以指向新的Boolean对象(其初始值为true)。原始布尔对象未更新。实际上,没有办法更新其实际价值。因此它不变。
答案 1 :(得分:1)
如果布尔值在Java中是不可变的,我怎样才能将测试从false更改为true?它不应该给我一个错误吗?
它不会给您一个错误,因为您将true
分配给test
变量,这是一个布尔类型。 System.out.println()
中的输出为true
。
布尔值不可变和Strings一样,您可以更改它的值并分配新的内存分配,但第一个引用仍保留在具有错误值。
答案 2 :(得分:1)
"可转让"是一个完全独立于Immutability的概念。赋值性是字段和变量的属性,而Immutability是类型的属性。
Boolean
(与Java中的所有对象一样)是引用类型。从本质上讲,它是一个指针。当我们谈到不变性时,它指的是单个物体发生变异的能力;指针本身可以随时更改为指向不同的对象(或为空),这与对象的不变性无关。
更简单的例子是
String greeting = "Hello, world.";
greeting = null;
字符串在Java中是不可变的,因此原始的String对象(包含对应于文本" Hello,world。"的数据)仍然存在,不变;我们所做的就是将指针指向其他地方。
如果变量或字段被声明为final
,则无法再重新分配给它,但如果类型是可变的,您仍然可以修改它。这基本上与你的情况相反(具有非最终字段/变量的不可变类型)。
差别与const指针和C / C ++中指针到const之间的差异基本相同。
答案 3 :(得分:0)
不可变,表示原始存储位置中存储的值不会更改。 例如
boolean variableOne = true;
boolean variableTwo = variableOne;
// variableOne --> true
// variableTwo --> true
现在,如果我将false赋给变量2,则会将新的内存位置分配给variableTwo,并且存储在变量one中的值将保持不变。
variableTwo.invert(); //Some method that inverts the value in that memory location
// variableOne --> true
// variableTwo --> false
现在,如果布尔值是可变对象,则在分配期间,该对象的引用将已分配给新变量,并且更改新变量将反映在原始变量中。
在某些地方,您希望复制变量的值,并且即使原始值更改时也不要更改,这是有利的。