对象之间的赋值
?
赋值使用等号操作符“=”。它的意思是“取得右边的值(通常称为右值),把它复制给左边(通常称为左值)”。右值可以是任何常数、变量或者表达式(只要它能生成一个值就行)。但左值必须是一个明确的、已命名的变量。也就是说,它必须是一个物理空间以存储等号右边的值。
?
对基本数据类型的赋值是很简单的。基本类型存储了实际的数值,而并非指向一个对象的引用, 所以在其赋值的时候,是直接将一个地方的内容复制到了另一个地方。例如,对基本数据类型使 用“a=b”,那么b 的内容就复制给a,若接着又修改了a,那么b 根本不会受这种修改的影响。
?
为“对象”赋值的时候,情况却不是这样了。对一个对象进行操作时,我们真正操作的是对对象的引用。所以倘若“将一个对象赋值给另一个对象”,实际是将“引用”从一个地方复制到另一 个地方。这意味着假若对对象使用“c = d”,那么c和d都指向原本只有d指向的那个对象
?
?
class Tank{int level;}public class Assignment {public static void main(String args[]){Tank t1 = new Tank();Tank t2 = new Tank();t1.level=19;t2.level=40;System.out.println("t1.level:"+t1.level+"; t2.level:"+t2.level);t1=t2;System.out.println("t1.level:"+t1.level+"; t2.level:"+t2.level);t1.level=27;System.out.println("t1.level:"+t1.level+"; t2.level:"+t2.level);}}///:~outputt1.level:19; t2.level:40t1.level:40; t2.level:40t1.level:27; t2.level:27
?由于“t1 = t2”操作的是一个对象的引用,这种现象通常称作“别名现象”,是java操作对象的一 种基本方式。在这个例子中如果想避免别名现象,可以这样写:
?????????????????????????????????????????????????t1.level = t2.level