如果我有一个对象的实例,并且该对象内是一个保存另一个对象的数据的变量。如果我更新第二个对象,那么该对象的副本也会更新,或者我是否需要同时更新所述对象的所有副本。
例如:
public class Object()
{
int x = xValue;
Object linked = saidObject;
}
public class doStuff()
{
saidObject.x++;
if(linked.equals(saidObject))
return true;
}
这段代码(不可编译显然只是填空)返回true?
答案 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 将它修改为 ..因为它就是它的本质。同样,改变不同的对象..就是改变不同的对象。