Java的赋值操作(=)应该分为两种情况:
1. 针对基本数据类型的赋值操作
2. 针对对象的赋值操作
基本数据类型的赋值很简单。基本数据类型存储了实际的数值,而并非是指向对象的引用,所以在为其赋值的时候,是直接讲一个地方的内容复制到了另一个地方。例如对基本数据类型使用a=b,那么b的内容直接复制给a。若接着又修改了a,而b根本不会受影响。
以交换两个数为例:
public class Swap {
public void swap(int a ,int b)
{
int temp=a;
a=b;
b=temp;
}
public static void main(String[] args) {
int a=5,b=6;
System.out.println("a="+a+"\tb="+b);
Swap s=new Swap();
s.swap(a, b);
}
}
输出结果为:a=5 b=6
我们可以看到,对基本数据类型的赋值操作并不会影响到原来的值。
但是当为对象赋值时,情况发生了变化。对一个对象进行操作时,我们真正操作的是对象的引用。所以如果将一个对象赋值给另一个对象,实际上是将引用从一个地方复制到另一个地方。这意味着如果对对象使用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=1;
t2.level=2;
System.out.println("t1.level:"+t1.level+"\tt2.level:"+t2.level);
t1=t2;
System.out.println("t1.level:"+t1.level+"\tt2.level:"+t2.level);
t1.level=25;
System.out.println("t1.level:"+t1.level+"\tt2.level:"+t2.level);
}
}
输出结果为:
t1.level:1 t2.level:2
t1.level:2 t2.level:2
t1.level:25 t2.level:25
方法调用的过程中也存在这样的别名问题:
class Letter
{
char c;
}
public class PassObject {
static void f(Letter f)
{
f.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
我们可以看到,实际上函数传递了一个引用,所以f()实际上改变的是该函数之外的对象。