先看个实例吧:
public static void main(String[] args) {
NewsJob job = new NewsJob();
job.setId(UUIDGenerator.getUUID());
System.out.println(job.getId());
NewsJob job2 = job;
job2.setId("asdf");
System.out.println(job.getId());
System.out.println(job2.getId());
}
输出结果为:
4adc3123c1d94e63a57c30b4bd9884a9
asdf
asdf
原理:
有两个实例A、B,要实现把B的值赋给A,大部分初学者会想到A=B,没错,进行这个操作以后,实例A、B包含的值是相同的,不过实际上却与我们期望的有所差异。我们知道A、B是实例句柄,而对象的实际数据是保存在内存堆中,在Java中执行A=B,实际上是把句柄B的值赋给句柄A,用C的说法就是,把指针B赋给指针A。OK,现在我们明白了,其实句柄A原来引用的对象已经失去了,再没法找回,句柄A、B已经引用到同一个内存堆的对象上去了,当然实例A、B是相同的,而句柄A原来引用的对象所占用的内存就靠GC来回收了。
现在我们如果修改实例A的数据成员的值,同样实例B的相应数据成员也会被修改成同样的值,这很容易理解,因为实例A、B引用的同一个对象实体。