java中的值传递和引用传递

来源:互联网 发布:中国经济数据网 编辑:程序博客网 时间:2024/04/30 13:04

最近看的一本面试书上写:

Java语言提供了两种参数传递的方式:值传递和引用传递。

值传递:在方法调用中,实参会把它的值传递给形参,形参只是用实参的值初始化一个临时的存储单元,因此形参与实参虽然有着相同的值,但是却有着不同的存储单元,因此对形参的改变不会影响实参的值。

引用传递:传递的是对象(也可以看作是对象的地址),这时形参与实参的对象指向同一块存储单元,因此对形参的修改就会影响实参的值。

后来在网上查阅了一些资料,说Java中只存在值传递,而引用传递,传递的是引用的地址值,实际上还是值传递。个人更倾向与这种说法。在Java中,除了8种基本数据类型(int、short、long、byte、float、double、char、boolean)是直接按值传递,而其他的类型都是传递的地址值。



public class Test{
public static void change(StringBuffer ss1,StringBuffer ss2){ss1.append(" World");ss2=ss1;}public static void main(String[] args){
int m=1;
int n=m;
n++;
System.out.println(m);
System.out.println(n);Integer a=1;Integer b=a;b++;System.out.println(a);System.out.println(b);StringBuffer s1=new StringBuffer("Hello");StringBuffer s2=new StringBuffer("Hello");change(s1,s2);System.out.println(s1);System.out.println(s2);}}

输出为:

1

2

1

2

Hello World

Hello

在上面的例子中,虽然m,n这一组和a,b这一组代码和结果基本上完全一样,但是他们实质上代表了两种不同的类型。int属于8中基本数据类型之一的,是直接传递值的,n=m后,m和n就指向不同的存储单元。但是Integer是int的包装类(不属于基本类型),一旦一个对象被创建出来后,就不允许修改它的值了。所以,b=a后,a和b指向同一块存储单元,b++后,单独分配了一块内存存储结果,把新的地址值给了b(等于新创建了一个值为2的Integer对象赋值给b)。所以这个时候a和b并没有任何关系了,他俩的值也不同了。s1将自己的地址值传给ss1,而在执行ss1.append(" World“)时,改变了这个地址值的那块内存里的值,从Hello变成了Hello world。s2将自己的地址值传递给ss2,但是在ss2=ss1时,ss2的地址值和ss1相同了,但是s2的地址值并没有任何改变。所以仍然是Hello。

                                             
0 0
原创粉丝点击