**

Java中的值传递机制**

**很多java初学者以及老手都对java中的值传递存在一个误区,认为java中的值传递机制像C++一样分为值传递与引用传递(地址传递),其实,java中只有值传递,没有引用传递或地址传递,无论方法中的形参是基本数据类型还是对象的引用,他们传递的都只是实参的副本。对于这个问题,我们可以看以下几个具体的例子分析:

一:形参是基本数据类型,方法中对实参副本的改变不会影响原实参的值

java 值传递 造成的问题 java的值传递机制_Java


这段代码最后a的输出结果是0,当调用函数fun(a)时,相当于此时b=a,实参a的值赋给了b,方法中的改变是对b的改变,跟a已经没了关系,所以最后a的输出结果还是0,这个例子很好理解。二:形参是对象的引用,方法中对实参副本的改变可能会影响原实参的值

java 值传递 造成的问题 java的值传递机制_计算机_02


这段代码对象main中a的值最后输出为2,当调用函数fun(main)时,此时m=main,即把对象main的引用赋给了m,此时对象main和m指向的是同一地址,方法中对对象m的内容a进行了改变,因为m和main指向了同一地址,所以实际上main中的内容a也跟着发生了改变,所以最后main.a=2.但是要注意,也有另外一种情况,形参是对象的引用的时候,方法中对实参副本的改变不会影响原实参的值,看下面这段代码示例:

java 值传递 造成的问题 java的值传递机制_java 值传递 造成的问题_03


这段代码最后输出的str1为abc,java中String字符串也是一种对象,但是这段代码里的str1为什么没有改变呢?因为当调用函数fun(str1)时,此时str=str1,即把字符串str1的引用赋给了str,str与str1指向的是同一个地址,但是在方法fun里,str=“def”,这时,str又指向了字符串def的地址,此时,str与str1已经不是指向同一个地址了,无论对str作何改变,都不会影响到str1,所以这段代码最后的输出结果为abc。

总结:Java中只有值传递,无论方法中的形参是什么类型的数据,传递的都只是实参的一个副本。不同的是,当形参是基本型的时候,对实参副本的修改不会影响到原来的实参;当形参是对象的引用时,由于实参的副本与原来的实参指向的是同一个地址,所以对实参副本内容的修改会影响到原来的实参,但是对实参副本地址的修改则不会影响到原来的实参。