如果方法具有局部变量i:

int i = 10;

然后分配一个新值:
i = 11;

这会分配一个新的内存位置吗?还是只替换原始值?

这是否意味着基元是不可变的?

最佳答案



Java并没有真正保证变量将与内存位置相对应。例如,您的方法可能以i存储在寄存器中的方式进行了优化-或者,如果编译器看到您从未真正使用过它的值,或者如果它可以跟踪代码,则可能根本不存储i = 11。并直接使用适当的值。

但是,把它放在一边。 。 。如果我们在这里将抽象化为局部变量表示调用堆栈上的内存位置,则i将仅修改该内存位置上的值。它不需要使用新的存储位置,因为变量1是唯一引用旧位置的内容。



是和否:是的,基元是不可变的,但是不,这不是因为上述原因。

当我们说某物是可变的时,我们的意思是它可以被突变:在仍然具有相同标识的情况下进行更改。例如,当您长出头发时,您正在突变自己:您仍然是您,但是您的属性之一是不同的。

对于基元,它们的所有属性都完全由它们的身份决定; 1始终表示1 + 1,无论如何,2始终是int。您无法更改。

如果给定的1变量的值为2,则可以将其更改为值为me,但这完全是标识的更改:它不再具有以前的值。这就像更改me指向别人而不是指向我:实际上并没有改变我,只是更改了sb

当然,对于对象,您通常可以同时执行以下两项操作:

StringBuilder sb = new StringBuilder("foo");
sb.append("bar"); // mutate the object identified by sb
sb = new StringBuilder(); // change sb to identify a different object
sb = null; // change sb not to identify any object at all

通常,这两种方法都将被描述为“changing sb”,因为人们会同时使用“ojit_code”来引用变量(包含引用)和引用的对象(当引用一个对象时)。只要您记得区别时,这种松散就可以了。

关于java - Java原语是不变的吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18037082/

10-10 16:57