java引用类型赋值问题

先看个实例吧:

 

	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引用的同一个对象实体。

你可能感兴趣的:(java,C++,c,C#)