2014-03-07 42 views
0

我不知道这是否只是我,或者如果它的东西我应该知道,但如果我这样做:如何在多个变量引用中共享可变变量的属性?

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

然后,是相同的值为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 
+3

你的两个例子不完全相同。你测试过第一个代码了吗?我认为它也不会改变'a'。 –

+0

我有,我已经得到所有这些输出线的代码来检查returnPoint中的值,但它并没有改变(就像我不希望它),直到我修改中心 – DuskFall

+0

Java通过值传递引用 - 这正是如何它应该工作。 –

回答

3

您可以尝试这样的事:

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

克隆方法将创建另一个实例拥有相同的值。

+0

嗯...对,谢谢 – DuskFall

+0

它是否也像枚举一样工作?如在,我是否需要克隆它们呢? – DuskFall

+0

Java枚举不可克隆。按照设计,JVM上的每个枚举值应该只有1个实例。 – andreban

2

在“returnPoint = center”中,您不需要复制中心,您可以参考它。因此,当你修改returnPoint时,你也修改了center。

0

在Java中,如果您有两个非原始数据类型的变量,那么设置为等于另一个不会产生克隆。你必须显式克隆第一个变量。

2

然后,是相同的值为b

号通过这样做b = 2,你做b = new Integer(2);。因此ab不再一样了。

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

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

0

如果你想存储的值,你需要有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点的表示。