3

在这个例子中,

int x = 5;
int y = x;
x = 4;

y 将保持为 5,因为 x 只是被重新分配,并且无论如何它都没有操作它曾经引用的对象。我的问题是,我刚才所说的是一种正确的思考方式吗?或者是否存在存储在“x”中的内存副本,并且该副本被放入“y”中。

4

3 回答 3

8

与对象不同,基元直接存储在变量中。也就是说,原始类型的变量不存储对原始类型的引用,它直接存储原始类型的值。

当一个原始变量分配给另一个原始变量时,它会复制该值。

当你这样做

int x = 5; int y = x; x = 4;

x将其中的值设置为 4,并且y仍然具有值 5,因为它的值是分开的。

通过更改另一个变量来更改一个变量的唯一方法是,如果两个变量都是对“可变”对象的引用,并且该对象发生了变异 - 因为它们都在查看同一个对象,而不是它们自己的副本,他们都观察到相同的变化。(例如,字符串是不可变的,永远不会“突然改变”,但数组和集合可以)

于 2013-05-13T06:52:13.003 回答
2

x和有 2 个单独的位置y。这里是原语而不是对象xy

当你这样做

int y = x;

y为 int 变量创建一个单独的内存,并将xie的值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).   
于 2013-05-13T06:52:01.200 回答
1

原始变量实际上保存值(而不是引用)。因此,在您创建原始变量的任何时间点,(该原始类型的)内存块都会为一个值保留,无论您是否为此分配了一个值。

(在任何低级语言中,您都可以将变量视为寄存器)

于 2013-05-13T06:58:00.573 回答