如果布尔值在 Java 中是不可变的,我该如何更改此布尔值?
If booleans are immutable in Java, how am I able to change this boolean?
下面的代码打印 true。
public static void main(String[] args) {
Boolean test = false;
test = true;
System.out.println(test);
如果布尔值在 Java 中是不可变的,我如何才能将测试从 false 更改为 true?它不应该给我一个错误吗?
混淆是因为 auto-boxing。代码应该是 read as
Boolean test = new Boolean(false);
test = new Boolean(true);
因此,您正在更改 reference 测试以指向一个新的布尔对象(其初始值为 true)。原始布尔对象未被更新。事实上,没有办法更新它的实际值。因此它是不可变的。
如果布尔值在 Java 中是不可变的,我如何才能将测试从 false 更改为 true?不应该报错吗?
它不会给你一个错误,因为你将 true
分配给 test
变量,这是一个布尔类型。 System.out.println()
中的输出将是 true
.
Boolean 和 Strings 一样 immutable,你可以改变它的值并分配新的内存分配,但是第一个 reference 仍然存在具有 false 值的内存分配。
"Assignability" 是与不变性完全不同的概念。可分配性是 属性 字段和变量,而不变性是 属性 类型。
Boolean
(与 Java 中的所有对象一样)是引用类型。本质上,它是一个指针。当我们谈到不变性时,它指的是单个对象发生变异的能力;指针本身可以随时更改为指向不同的对象(或指向 null),这与对象的不变性无关。
一个更简单的例子是
String greeting = "Hello, world.";
greeting = null;
字符串在Java中是不可变的,所以原来的String对象(包含文本"Hello, world."对应的数据)仍然存在,没有变化;我们所做的只是将我们的指针指向其他地方。
如果声明了变量或字段 final
,您将无法再对其重新赋值,但如果类型是可变的,您仍然可以修改它。这基本上与您的情况相反(具有 non-final field/variable 的不可变类型)。
本质上和C/C++中const指针和pointer-to-const的区别是一样的。
不可变意味着存储在原始内存位置的值不会改变。
例如
boolean variableOne = true;
boolean variableTwo = variableOne;
// variableOne --> true
// variableTwo --> true
现在,如果我将 false 赋值给变量二,一个新的内存位置将分配给变量二,而存储在变量一中的值不会改变。
variableTwo.invert(); //Some method that inverts the value in that memory location
// variableOne --> true
// variableTwo --> false
现在,如果布尔值是可变对象,在赋值期间,对象的引用将被赋值给新变量,并且更改新变量将反映在原始变量中。
这在您想要复制变量值的某些地方是有利的,并且即使原始值发生变化也希望相同值不发生变化。
下面的代码打印 true。
public static void main(String[] args) {
Boolean test = false;
test = true;
System.out.println(test);
如果布尔值在 Java 中是不可变的,我如何才能将测试从 false 更改为 true?它不应该给我一个错误吗?
混淆是因为 auto-boxing。代码应该是 read as
Boolean test = new Boolean(false);
test = new Boolean(true);
因此,您正在更改 reference 测试以指向一个新的布尔对象(其初始值为 true)。原始布尔对象未被更新。事实上,没有办法更新它的实际值。因此它是不可变的。
如果布尔值在 Java 中是不可变的,我如何才能将测试从 false 更改为 true?不应该报错吗?
它不会给你一个错误,因为你将 true
分配给 test
变量,这是一个布尔类型。 System.out.println()
中的输出将是 true
.
Boolean 和 Strings 一样 immutable,你可以改变它的值并分配新的内存分配,但是第一个 reference 仍然存在具有 false 值的内存分配。
"Assignability" 是与不变性完全不同的概念。可分配性是 属性 字段和变量,而不变性是 属性 类型。
Boolean
(与 Java 中的所有对象一样)是引用类型。本质上,它是一个指针。当我们谈到不变性时,它指的是单个对象发生变异的能力;指针本身可以随时更改为指向不同的对象(或指向 null),这与对象的不变性无关。
一个更简单的例子是
String greeting = "Hello, world.";
greeting = null;
字符串在Java中是不可变的,所以原来的String对象(包含文本"Hello, world."对应的数据)仍然存在,没有变化;我们所做的只是将我们的指针指向其他地方。
如果声明了变量或字段 final
,您将无法再对其重新赋值,但如果类型是可变的,您仍然可以修改它。这基本上与您的情况相反(具有 non-final field/variable 的不可变类型)。
本质上和C/C++中const指针和pointer-to-const的区别是一样的。
不可变意味着存储在原始内存位置的值不会改变。 例如
boolean variableOne = true;
boolean variableTwo = variableOne;
// variableOne --> true
// variableTwo --> true
现在,如果我将 false 赋值给变量二,一个新的内存位置将分配给变量二,而存储在变量一中的值不会改变。
variableTwo.invert(); //Some method that inverts the value in that memory location
// variableOne --> true
// variableTwo --> false
现在,如果布尔值是可变对象,在赋值期间,对象的引用将被赋值给新变量,并且更改新变量将反映在原始变量中。
这在您想要复制变量值的某些地方是有利的,并且即使原始值发生变化也希望相同值不发生变化。