在java中更新对象的问题

时间:2013-11-07 03:11:47

标签: java oop reference

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

例如:

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

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

这段代码(不可编译显然只是填空)返回true?

3 个答案:

答案 0 :(得分:1)

通过做:

Object linked = saidObject;

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

复制或克隆对象在某些情况下可能很有用,但不是通常情况。

答案 1 :(得分:1)

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

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

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

e.g。

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;)并且它指向相同类型的对象并不重要,原则是相同的:{{ 1}}表示它们指向同一个对象,没有创建新内容。

答案 2 :(得分:0)

对象实例本身并且与其他所有实例都不同。

也就是说,改变一个对象(通过重新分配一个字段) someplace 将它修改为 ..因为它就是它的本质。同样,改变不同的对象..就是改变不同的对象。