如果布尔值在Java中是不可变的,我怎么能改变这个布尔值?

时间:2017-01-17 03:05:52

标签: boolean immutability

以下代码打印为true。

public static void main(String[] args) {

        Boolean test = false;
        test = true;
        System.out.println(test);

如果布尔值在Java中是不可变的,我怎样才能将测试从false更改为true?它不应该给我一个错误吗?

4 个答案:

答案 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

现在,如果布尔值是可变对象,则在分配期间,该对象的引用将已分配给新变量,并且更改新变量将反映在原始变量中。

在某些地方,您希望复制变量的值,并且即使原始值更改时也不要更改,这是有利的。