在Java学习的过程中,我们一直以为(其实是我一直以为)赋值符号“=”只是简单地将右边的值传递给左边的值,左边的值变成了右边的值,而右边的值却没有因此而做任何改变。
其实在对于基本数据类型的赋值当中确实是这样的,但是Java中的数据类型却不仅仅是那几种数据类型,而是还包括了“引用的数据类型”,于是在为对象赋值的时候,情况却发生了不一样的变化。
“别名现象所发生的情况”
其实我们对对象进行操作的时候,其实是操作的是对对象的引用。
- 对象给对象赋值
- 在我们给对象为对象赋值的时候,实际上是将“引用”从一个地方赋值到另一个地方,比如对象a赋值给对象b,即a=b;那么a和b都同时指向了原来b的那个对象。
- 方法中的别名问题
- 将一个对象传递给方法时,也会产生这样的问题,具体的在代码中解释
代码验证
- 首先我们来验证一下对象给对象赋值时的“别名情况”
//新建一个只有一个属性的类
class Fly{
float number;
}
public class Test {
public static void main(String[] args) {
//创建两个对象来验证“别名现象”
Fly f1 = new Fly();
Fly f2 = new Fly();
f1.number=12.3f;
f2.number=38.5f;
//输出原本的值
System.out.println("f1.number的值为:"+f1.number+"\tf2.number的值为:"+f2.number);
//将f2赋值给f1,然后输出结果
f1 = f2;
System.out.println("f1.number的值为:"+f1.number+"\tf2.number的值为:"+f2.number);
//改变f1的值,输出f1和f2的结果
f1.number = 108.2f;
System.out.println("f1.number的值为:"+f1.number+"\tf2.number的值为:"+f2.number);
}
}
最后得出的结果为:
f1.number的值为:12.3 f2.number的值为:38.5
f1.number的值为:38.5 f2.number的值为:38.5
f1.number的值为:108.2 f2.number的值为:108.2
- 从上面的代码可以看出,特别是在给f1的number值重新赋值以后,原本以为输出的是f1是108.2,而f2仍然是35.8,但是结果都是输出了108.2。之所以会产生这样的结果是因为当f2赋值给f1的时候,f1和f2同时指向相同的对象(可以参考上边的图片)。当f1修改了之后,由于他们两个是指向了相同的引用的,因此f2也跟着修改了。
- 验证方法中的别名问题
//创建一个普通的类
class ToImfor{
float f;
}
public class Imfor {
//用来验证对象传递给方法时
static void check(ToImfor y) {
y.f = 18.8f;
}
public static void main(String[] args) {
ToImfor t = new ToImfor();
t.f = 28.8f;
//输出t.f的值,好与接下来传递参数时所得值对比
System.out.println("t.f的值:"+t.f);
//调用方法传值
check(t);
System.out.println("t.f的值:"+t.f);
}
}
结果为:
t.f的值:28.8
t.f的值:18.8
从结果可以看出,当t传递给check(ToImfor y)方法时,其实只是传递了一个引用而已(并非值28.8f),所以在最后输出t.f的时候,t.f的值会变成18.8