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

Java 多个变量引用之间如何共享可变变量的属性?,java,mutable,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 a

我不确定这是否只是我,或者这是我应该知道的,但如果我知道:

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

您可以尝试以下方法:

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

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

在returnPoint=center中,如果不复制center,则引用它。因此,当您修改returnPoint时,您也会修改center。

在Java中,如果有两个数据类型的变量不是基元变量,则设置为“等于另一个”不会提供克隆。必须显式克隆第一个变量

那么a与b的值相同

不可以。通过执行b=2,就可以执行b=newinteger2;。因此a和b不再相同

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


除了.clone之外,还有一种解决方案是创建一个复制构造函数,即以另一个点作为参数。

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

您的示例

Object a = 1;
Object b = a;
b = 2;
不描述与其他代码相同的问题。上述示例将导致a=新整数1,而b=新整数2。请注意,整数实例是不可变的,不适用于点

为了理解错误,考虑一个可变整数类:

class MutableInteger {
  public int value;
}
现在,让我们使用该类在第一个示例代码的点相关代码中重新创建问题:

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);

以创建描述相同坐标的新点。您可以在不改变中心点表示的情况下对复制的点进行变异。

您的两个示例并不完全相同。你测试过第一个代码了吗?我不认为它也会改变。我有,我有所有这些输出行代码来检查returnPoint中的值,但它不会像我希望的那样改变,直到我修改centerJava按值传递引用-这正是它应该如何工作的。是吗?好的,假设我想复制中心,而不是指向原始中心,我该怎么做?@Dashfall我问你是否测试过Obejct a,b代码。它真的改变了a的值吗?它永远也做不到。枚举也是这样吗?如中所示,我是否也需要克隆它们?Java枚举是不可克隆的。根据设计,JVM上每个枚举值应该只有一个实例。哦,很好,我正在编写一个游戏引擎,就像所有人一样,我想知道为什么每次实体移动时返回点都会改变查看那些书籍:和