0

如果我有一个对象的实例,并且在该对象中是一个保存另一个对象数据的变量。如果我更新第二个对象,该对象的副本也会更新,还是我需要同时更新所述对象的所有副本。

例如:

public class Object()
{
    int x = xValue;
    Object linked = saidObject;
}

public class doStuff()
{
   saidObject.x++;
   if(linked.equals(saidObject))
       return true;
}

这段代码(显然不能编译,只是填空)会返回 true 吗?

4

3 回答 3

1

通过做:

Object linked = saidObject;

你不是在复制对象,只是创建另一个指向它的指针,这意味着你有两个指向同一个对象的不同指针。

在某些情况下复制或克隆对象可能很有用,但通常情况下并非如此。

于 2013-11-07T03:22:25.763 回答
1

if(linked.equals(saidObject))将返回 true,因为这两个变量确实指向同一个对象。

在 Java 中,所有变量和字段都是对存在于内存某处的实际对象的引用。

当您将一个变量分配给另一个变量时,就像复制对象的地址,以便它们都指向内存中的同一个对象。

例如

Object a = new Object();  // this actually creates the Object in memory
Object b = a;             // this copies the reference to Object from a to b
// At this point, a and b point to exactly the same object in memory. Therefore ...
a.equals(b);              // returns true.

实际上a == b也返回 true,这是比较这种情况的更好方法,因为==比较两个变量是否指向同一个对象(它们确实如此),而equals()通常按值比较,这在这里是不必要的。

是否b实际上是a(例如class Obj { Obj b; }; Obj a = new Obj(); a.b = a;)内的字段并指向相同类型的对象并不重要,原理是相同的:a = b意味着它们指向相同的对象,没有创建任何新内容。

于 2013-11-07T03:23:46.420 回答
0

一个对象实例就是它自己,并且与其他实例不同。

也就是说,在某个地方改变一个对象(通过重新分配一个字段)会在任何地方修改它......好吧,它就是这样。同样,改变一个不同的对象 .. 就是改变一个不同的对象。

于 2013-11-07T03:14:14.780 回答