可变变量的属性如何在多个变量引用之间共享?

时间:2014-03-07 12:47:31

标签: java mutable

我不确定这只是我,还是我应该知道的事情,但如果我知道的话:

Object a = 1;
Object b = a;
b = 2;

然后a与b的值相同。这是正常的行为吗?因为我想复制变量,而不是引用它。

我问的原因是我有一些像这样的代码:

center = new Point(0.0f,1.0f,1.0f);
returnPoint = center;
...
returnPoint.x = 1.0f;
//For some reason, above modifies center as well as return

6 个答案:

答案 0 :(得分:3)

您可以尝试这样的事情:

center = new Point(0.0f,1.0f,1.0f);
returnPoint = center.clone();
...
returnPoint.x = 1.0f;

clone方法将创建另一个具有相同值的实例。

答案 1 :(得分:2)

在“returnPoint = center”中你不复制中心,你引用它。因此,当您修改returnPoint时,您还可以修改center。

答案 2 :(得分:2)

  

然后a与b

的值相同

没有。通过执行b = 2,您可以执行b = new Integer(2);。因此ab不再相同。

至于你的第二个例子,这是正常的:returnPointcenter相同的参考;如果您修改returnPoint的内容,则修改center的内容,因为它们“引用”完全相同的对象。您需要复制center

.clone()以外的一个解决方案是创建一个复制构造函数(即将另一个Point作为参数)。

答案 3 :(得分:2)

你的例子

Object a = 1;
Object b = a;
b = 2;

没有描述与其他代码相同的问题。上面的示例将导致a = new Integer(1)b = new Integer(2)。请注意,整数实例是不可变的,不适用于Point

要了解出错的地方,请考虑一个可变整数类:

class MutableInteger {
  public int value;
}

现在让我们使用此类在第一个示例代码的Point相关代码中重新创建问题:

MutableInteger mi = new MutableInteger();
mi.value = 1;
Object a = mi;
Object b = a;
mi.value = 2;

会导致ab指向MutableInteger的同一个实例。由于您更改了后一个实例的值,因此b的更改将影响a引用的值。但是,它不会更改a

的分配

为了避免您的问题,您不应该共享Point实例。使用:

returnPoint = new Point(center);

以创建描述相同坐标的新点。您可以改变复制的点而不改变center点的表示。

答案 4 :(得分:0)

在Java中,如果您有两个非原始数据类型的变量,则设置为等于另一个不会为您提供克隆。您必须明确克隆第一个变量。

答案 5 :(得分:0)

如果要存储值,则需要有3个浮点变量并将值存储在其中。但请记住使用“float”,而不是“Float”。