我不确定这只是我,还是我应该知道的事情,但如果我知道的话:
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
答案 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);
。因此a
和b
不再相同。
至于你的第二个例子,这是正常的:returnPoint
是与center
相同的参考;如果您修改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;
会导致a
和b
指向MutableInteger
的同一个实例。由于您更改了后一个实例的值,因此b
的更改将影响a
引用的值。但是,它不会更改a
!
为了避免您的问题,您不应该共享Point
实例。使用:
returnPoint = new Point(center);
以创建描述相同坐标的新点。您可以改变复制的点而不改变center
点的表示。
答案 4 :(得分:0)
在Java中,如果您有两个非原始数据类型的变量,则设置为等于另一个不会为您提供克隆。您必须明确克隆第一个变量。
答案 5 :(得分:0)
如果要存储值,则需要有3个浮点变量并将值存储在其中。但请记住使用“float”,而不是“Float”。