天天看点

Java笔记---别名现象

在Java学习的过程中,我们一直以为(其实是我一直以为)赋值符号“=”只是简单地将右边的值传递给左边的值,左边的值变成了右边的值,而右边的值却没有因此而做任何改变。

        其实在对于基本数据类型的赋值当中确实是这样的,但是Java中的数据类型却不仅仅是那几种数据类型,而是还包括了“引用的数据类型”,于是在为对象赋值的时候,情况却发生了不一样的变化。

“别名现象所发生的情况”

       其实我们对对象进行操作的时候,其实是操作的是对对象的引用。

  • 对象给对象赋值
    • 在我们给对象为对象赋值的时候,实际上是将“引用”从一个地方赋值到另一个地方,比如对象a赋值给对象b,即a=b;那么a和b都同时指向了原来b的那个对象。
    • Java笔记---别名现象
  • 方法中的别名问题
    • 将一个对象传递给方法时,也会产生这样的问题,具体的在代码中解释

代码验证

  • 首先我们来验证一下对象给对象赋值时的“别名情况”  
//新建一个只有一个属性的类
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