如果我有一个对象的实例,并且在该对象中有一个保存另一个对象的数据的变量。如果我更新了第二个对象,那么该对象的副本也会被更新,还是需要同时更新该对象的所有副本。
例如:
public class Object()
{
int x = xValue;
Object linked = saidObject;
}
public class doStuff()
{
saidObject.x++;
if(linked.equals(saidObject))
return true;
}
这段代码(显然不能编译,只需填空)会返回true吗?
发布于 2013-11-06 19:23:46
当两个变量指向同一个对象时,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-06 19:22:25
通过这样做:
Object linked = saidObject;
您不是在复制对象,只是创建另一个指向对象的指针,这意味着您有两个指向同一个对象的不同指针。
在某些情况下,复制或克隆对象可能很有用,但并不是通常的情况。
发布于 2013-11-06 19:14:14
对象实例本身就是对象实例,与其他每个实例都不同。
也就是说,改变一个对象(通过重新分配一个字段),在任何地方都会修改它。因为,嗯,事情就是这样的。同样,变异另一个对象..。就是改变另一个物体。
https://stackoverflow.com/questions/19827319
复制