如果方法具有局部变量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/