在写文章内容之前,终于下定决心去阅读那本被很多人说是大部头的《Java编程思想(第四版)》,作为一个新晋的Java菜鸟,总觉得里边的知识确实挺难的,因为要有C语言和C++的基础,但是我对这两门语言的认识基本停留在只是知道有这两门语言的存在,具体的并没有多大的深入。此外,虽然很多人说这本书并不适合初学者学习,但是个人虽然还是初学者,虽然对里边的一些东西还不是有多大的理解(我说的是具体每一句话),但只是阅读到了第三章也就感觉颇丰了。
第一次写博客,如果有什么错误的请大家指教。
在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
以上就是我本人理解的“别名问题”,如有错误,请大家指教。