在这个例子中,
int x = 5;
int y = x;
x = 4;
y 将保持为 5,因为 x 只是被重新分配,并且无论如何它都没有操作它曾经引用的对象。我的问题是,我刚才所说的是一种正确的思考方式吗?或者是否存在存储在“x”中的内存副本,并且该副本被放入“y”中。
与对象不同,基元直接存储在变量中。也就是说,原始类型的变量不存储对原始类型的引用,它直接存储原始类型的值。
当一个原始变量分配给另一个原始变量时,它会复制该值。
当你这样做
int x = 5;
int y = x;
x = 4;
x
将其中的值设置为 4,并且y
仍然具有值 5,因为它的值是分开的。
通过更改另一个变量来更改一个变量的唯一方法是,如果两个变量都是对“可变”对象的引用,并且该对象发生了变异 - 因为它们都在查看同一个对象,而不是它们自己的副本,他们都观察到相同的变化。(例如,字符串是不可变的,永远不会“突然改变”,但数组和集合可以)
x
和有 2 个单独的位置y
。这里是原语而不是对象x
。y
当你这样做
int y = x;
y
为 int 变量创建一个单独的内存,并将x
ie的值5
复制到该位置。
在此之后,如果您x
通过执行以下操作将任何其他值重新分配给变量:
x = 4;
,它并没有体现在 的价值上y
。
即使您使用 Wrapper 类Integer
,它也会以类似的方式表现,因为这些是不可变的类。例如:
Integer x = new Integer(5);
Integer Y = x; //now both `x` and `y` point to the same `integer` object with the value 5.
x= new Integer(4); // now since `x` is pointing to a different object than `y`, both `x` and `y` remain independent(i.e change in one does not reflect in another).
原始变量实际上保存值(而不是引用)。因此,在您创建原始变量的任何时间点,(该原始类型的)内存块都会为一个值保留,无论您是否为此分配了一个值。
(在任何低级语言中,您都可以将变量视为寄存器)