问题的提出:
在java中,对基本数据类型的赋值时,是将数据从一个地方复制到另外一个地方,当a=b时,将b的内容复制给a,若修改a时,b并不会受到这种修改的影响。
在对对象进行赋值时,当我们对一个对象进行操作时,实际上是对该对象进行引用,倘若将一个对象赋值给另一个对象,实际上是将引用复制到另外一个地方。
图示
代码演示
class Tank{
float level;
}
public class Assignment {
public static void main(String[] args) {
Tank t1=new Tank();
Tank t2=new Tank();
t1.level=0.9f;
t2.level=10.05f;
System.out.print("t1.level:"+t1.level+",t2.level:"+t2.level);
t1=t2;
System.out.print("t1.level:"+t1.level+",t2.level:"+t2.level);
t1.level=0.7f;
System.out.print("t1.level:"+t1.level+",t2.level:"+t2.level);
}
}
结果输出:
t1.level:0.9,t2.level:10.05
t1.level:10.05,t2.level:10.05
t1.level:0.7,t2.level:0.7
为了避免别名情况出现,一般不对对象进行赋值,可使用t1.level=t2.level进行赋值,这样可以使得对象相互独立。
将一个对象传递给方法时,也会产生别名问题,代码示例
class Letter{
char c;
}
public class PassObject{
static void f(Letter y) {
y.c='z';
}
public static void main(String[] args){
Letter x=new Letter();
x.c='a';
System.out.println("x.c="+x.c);
f(x);
System.out.println("x.c="+x.c);
}
}
结果演示:
x.c=a
x.c=z