Java里在使用对象的时候,是传址还是传值呢?看看这句经典名言: O'Reilly's Java in a Nutshell by David Flanagan (see Resources) puts it best: "Java manipulates objects 'by reference,' but it passes object references to methods 'by value.'"从这句话可以看出,java应该是传址调用的(如果想深入了解的话,可以了解一下java虚拟机规范关于基本数据类型和复合数据类型(也就是对象)在栈和堆中的存储方式,以加深理解)。
我们也可以自己做个小实验:
本数据类型比较简单,因为数据存储空间比较小,每个不同的基本数据类型都有单独的存储空间,比如i=1,b=1,a和b是指向同一空间的。如果b=2了,那就新开一个空间,在把b指向这个位置。
对象的情况如下:
User u1=new User();
System.out.println(u1);
User u2=new User();
System.out.println(u2);
User u3=u1;
System.out.println(u3);
输出:
com.springMVC.entity.User@a62fc3
com.springMVC.entity.User@89ae9e
com.springMVC.entity.User@a62fc3
从以上的输出可以看到,java是传址调用的。
但是String是一个特殊的对象,他生成方式象对象,但是存储方式又像基本数据类型。
String str1="11111";
System.out.println(str1.hashCode());
String str2="22222";
System.out.println(str2.hashCode());
String str3="11111";
System.out.println(str3.hashCode());
输出:
3541024
3541025
3541024
从输出数据可以看到,str1没有附值给str3,但是str1和str3指向的位置是一样的。为什么会怎样,因为存储方式跟基本数据类型是一样的,str1生成的时候,内存分配了位置保存“11111”,当str3生成的时候,java虚拟机会在内存中查找是否已经有“11111”,如果有他就将str3指向这个位置,如果没有,就新生成一个。
在函数中使用传址(引用)还是值,定义按值传递和按引用传递这两个术语是重要的。按值传递意味着当将一个参数传递给一个函数时,函数接收的是原始值的一个副本。因此,如果函数修改了该参数,仅改变副本,而原始值保持不变。按引用传递意味着当将一个参数传递给一个函数时,函数接收的是原始值的内存地址,而不是值的副本。因此,如果函数修改了该参数,调用代码中的原始值也随之改变。
上面的这些是很重要的,请大家注意以下几点结论,这些都是我认为的上面的文章中的精华和最终的结论:
1、对象是按引用传递的,
2、基本数据类型是按值传递(包括特殊的对象String),
3、按值传递意味着当将一个参数传递给一个函数时,函数接收的是原始值的一个副本,原来值不会变。
4、按引用传递意味着当将一个参数传递给一个函数时,函数接收的是原始值的内存地址,而不是值的副本,对象的内容会变。
多于2个Bay被计划, 请联系EC处理=\u591a\u4e8e2\u4e2aBay\u88ab\u8ba1\u5212, \u8bf7\u8054\u7cfbEC\u5904\u7406
多于2個Bay被計劃, 請聯系EC處理=\u591a\u4e8e2\u500bBay\u88ab\u8a08\u5283, \u8acb\u806f\u7cfbEC\u8655\u7406