本文共 1027 字,大约阅读时间需要 3 分钟。
无内鬼,先来整个例子:
Employee a = new Employee("Alice");Employee b = new Employee("Bob");swap(a,b);public static void swap(Employee x,Employee y){ Employee temp = x; x = y; y = temp;}
我们知道这里给函数 swap 传进来两个对象的引用,然后在内部将他们两个进行了交换。按理来说如果 Java 对对象采用的是按引用调用则,输出来应该是交换成功的。
但是结果,并不是这样而是他们根本没有被交换,所以 Java 参数传递是按值掉用的。
我们来分析一下原因:
一开始传入 swap 函数中时,a,b本来就已经指向了 Employee 类的实例了,而在 java 中并不是把两个引用原封不动的传到函数内,而是各拷贝了一份引用 x,y 也指向了 Employee 类的实例。
在函数内进行交换时,只交换了 x,y 引用的指向,它们确实交换成功了。但是函数结束后变量销毁,我们输出的还是 a,b 的引用所指向的实例,a,b 本身并没有发生改变,所以在 Java 这里并没有发生交换,体现了并不是按引用传递的。
我们看下面代码:
User u1 = new User();User u2 = new User();u1.name = "张三";u2.name = "李四";exchange2(u1, u2);System.out.println(u1.name);System.out.println(u2.name);public static void exchange2(User x,User y) { String temp = x.name; x.name = y.name; y.name = temp;}
我们仍把对象的引用 a,b 传进函数内,函数内仍会生成引用的拷贝 x,y,但是通过 x 直接调用到了实例的属性 name并对其进行了交换,当函数结束时虽然销毁了引用 x,y 但是实例的值已经发生了改变。
所以这下你应该弄懂了 Java 参数传递总是值传递了。
转载地址:http://zzprn.baihongyu.com/