第三章 操作符
3.4赋值
赋值使用操作符“=”,它的意思是将右边的值,赋值给左边。
1 | a = 4; |
对基本对象的赋值是简单的,基本类型存储了实际的值,而并非指向一个对象的引用。如a=b,那么b的值就给了a,但是修改a之后,b不受影响。
对一个对象进行操作时,我们真正操作的是对对象的引用。所以倘若“将一个对象赋值给另一个对象”,实际是将“引用”从一个地方复制到另一个地方。这意味着假若对对象使用c=d,那么c和d都指向原本只有d指向的那个对象。下边是一个例子:
1 | class Tank{ |
程序输出Output:
1: t1.level: 9, t2.level: 47
2: t1.level: 47, t2.level: 47
3: t1.level: 27, t2.level: 27
原本t1包含的对对象的引用,是指向一个值为9的对象。在对t1赋值的时候,这个引用被覆盖,也就是丢失了,而那个不再被引用的对象由“垃圾回收器”自动清理。
这种特殊的现象通常称作“别名现象”,是Java操作对象的基本方式。在这个例子中,如果想避免别名问题应该怎么办呢?可以这样写:
1 | t1.level = t2.level; |
3.4.1方法调用中的别名问题
将一个对象传递给方法时,也会产生别名问题:
1 | class Letter{ |
程序输出Output:
1: x.c:a
2: x.c:z