先看参数为基本类型的情况:
public class Demo1 { public void swap(int a,int b){ a = a^b; b = a^b; a = a^b; System.out.println("swap: a="+a+",b="+b); } public static void main(String[] args) { Demo1 demo1 = new Demo1(); int a = 1; int b = 2; demo1.swap(a, b); System.out.println("main: a="+a+",b="+b); } } 输出: swap: a=2,b=1 main: a=1,b=2
上面的代码想通过swap交互a和b的值,在swap内部,变量a和b已经交换成功了,但在main中a和b的值依然是原来的值.
再看参数为引用的情况:
public class Demo2 { public void swap(StringBuffer a,StringBuffer b){ StringBuffer c = a; a=b; b=c; System.out.println("swap: a="+a+",b="+b); } public static void main(String[] args) { StringBuffer a = new StringBuffer("a"); StringBuffer b = new StringBuffer("b"); Demo2 demo2 = new Demo2(); demo2.swap(a, b); System.out.println("main: a="+a+",b="+b); } }
输出: swap: a=b,b=a main: a=a,b=b
和参数为基本类型的情况结果是一致的.
为什么会出现这种情况呢?
我们来分析下上面的参数传递过程,以Demo2为例:
图1是swap未计算前的参数值,
图2是swap计算后的参数值.
从图中可以看出,swap的计算过程只能改变swap内部变量a和b的值,不能改变main中的a和b变量的引用值,换言之,参数的传递只能传值,不存在传引用一说.
请注意,上面我说不能改变a和b变量的引用值,可没说不能改变a和b指向的对象的值.再看下面的例子:
public class Demo3 { public void swap(StringBuffer a,StringBuffer b){ a.append(b); StringBuffer c = a; a=b; b=c; System.out.println("swap: a="+a+",b="+b); } public static void main(String[] args) { StringBuffer a = new StringBuffer("a"); StringBuffer b = new StringBuffer("b"); Demo3 demo3 = new Demo3(); demo3.swap(a, b); System.out.println("swap: a="+a+",b="+b); } } 这个会输出什么呢? swap: a=b,b=ab swap: a=ab,b=b
这个就是上面所说的,在swap内部的计算过程中,改变了main.a所指向对象的值.
就像下面的图所描述的那样:
但根本上,swap不能改变main中a和b的引用值.
另外贴一句sun公司官方文档上的描述这一问题的原话:
Java is always pass-by-value.when object is passed as a argument, be careful with that it is also the copy of reference
所以,现在你应该知道,java传递的只会是值,没有传递引用.
转载时,请说明出处,有疑问可以关注我的微博账号: