首先看程序:

package operators;
public class E02_Aliasing {
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Integral n1 = new Integral();
		Integral n2 = new Integral();
		n1.f = 9f;
		n2.f = 47f;
		System.out.println("1:n1.f:"+n1.f+",n2.f:"+n2.f);
		n1 = n2;
		System.out.println("2:n1.f:"+n1.f+",n2.f:"+n2.f);
		n1.f = 27f;
		System.out.println("3:n1.f:"+n1.f+",n2.f:"+n2.f);
	}

}
class Integral{
	float f;
}

输出结果:
Java赋值详解
或许很多人都明白第一条输出语句,但第二条和第三条输出就有可能不太明白了,下面我来解释一下原因:
在Java中,在为对象“赋值”时,我们真正操作的是对对象的引用。所以倘若“将一个对象赋值给另一个对象”,实际上是将“引用”从一个地方赋值到另一个地方。这意味着假若对对象使用c = d ,那么c和d都指向原本只有d指向的那个对象。

再来看这个例子:
Integral类非常简单,只有一个f属性,它的两个实例(n1,n2)是在main()方法里面创建的。刚开始时,对每一个Integral类都赋予了一个不同的值,然后,将 n2 赋给 n1 ,接着又修改了 n1 。在许多编程语言中,我们可能会希望n1和 n2 总是相互独立的。但由于对对象的赋值操作时对一个对象的引用,所以修改 n1 的同时也改变了n2 。这是由于n1和n2包含的是相同的引用,他们指向相同的对象。(原本n1包含的对对象的引用,是指向一个值为9的对象。在对n1赋值的时候,这个引用被覆盖,也就是丢失了;而那个不再被引用的对象会由“垃圾回收器”自动清理。)

这种特殊的现象通常称作“别名”现象,是Java操作对象的一种基本方式。在这个例子中,如何避免别名现象呢,可以这样写:
n1.f = n2.f;

相关文章: