在此示例中,
int x = 5;
int y = x;
x = 4;
y将保持为5,因为x正在被重新分配,并且它无论如何都不会操纵它用来引用的对象。我的问题是,我刚刚说了一个正确的思考方式吗?或者是否存在“x”中存储的重复内存,并且重复放在“y”中。
答案 0 :(得分:8)
与对象不同,基元直接存储在变量中。也就是说,基本类型的变量不存储对基元的引用,它直接存储基元的值。
当一个原始变量被分配给另一个原始变量时,它会复制该值。
当你这样做时
int x = 5;
int y = x;
x = 4;
x
将其中的值设置为4,y
仍然具有值5,因为它的值是独立的。
通过更改另一个变量来改变一个变量的唯一方法是,如果两个变量都是对“可变”对象的引用,并且对象是变异的 - 因为它们都在查看同一个对象,而不是他们自己的副本,他们都观察到同样的变化。 (例如,字符串是不可变的,永远不会“突然改变”,但数组和集合可以)
答案 1 :(得分:2)
x
和y
有2个单独的位置。 x
和y
这里是基元而不是对象。
当你这样做时
int y = x;
创建了一个用于int变量y
的单独内存,并将x
的值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).
答案 2 :(得分:1)
原始变量实际上包含值(不是引用)。因此,在任何时候你创建一个原始变量,一个内存块(该原始类型)都会为一个值保留,无论你是否为它分配了一个值。
(在任何低级语言中,您都可以将变量视为寄存器)