正确的原始任务思维方式

时间:2013-05-13 06:50:02

标签: java primitive

在此示例中,

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

y将保持为5,因为x正在被重新分配,并且它无论如何都不会操纵它用来引用的对象。我的问题是,我刚刚说了一个正确的思考方式吗?或者是否存在“x”中存储的重复内存,并且重复放在“y”中。

3 个答案:

答案 0 :(得分:8)

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

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

当你这样做时

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

x将其中的值设置为4,y仍然具有值5,因为它的值是独立的。

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

答案 1 :(得分:2)

xy有2个单独的位置。 xy这里是基元而不是对象。

当你这样做时

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)

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

  

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