/*** java中是否有“值传递”也有“引用传递”** @author: JC.Lin* @data: 2019/2/19 22:13*/
public class TransferParamTest {static class Demo {int a;public Demo(int a) {this.a = a;}}private static void function1(Demo d1, Demo d2) {int a;a = d1.a;d1.a = d2.a;d2.a = a;}private static void function2(Demo d1, Demo d2) {Demo temp;temp = d1;d1 = d2;d2 = temp;}@Testpublic void test1() {Demo d1 = new Demo(1);Demo d2 = new Demo(2);System.out.println(d1.a + " " + d2.a);function1(d1, d2);System.out.println(d1.a + " " + d2.a);}@Testpublic void test2() {Demo d1 = new Demo(1);Demo d2 = new Demo(2);System.out.println(d1.a + " " + d2.a);function2(d1, d2);System.out.println(d1.a + " " + d2.a);}}
有人的观点如下:执行上面的代码test1(),调用function1()函数以前输出的结果是1、2,调用function1()函数之后输出的结果会是2、1,可见在函数内对d1和d2的改变反映到了原来的变量上,要不是不会输出2、1的。
这种解释是很迷惑人的,看上去好像很正确,但test2()代码会很好的反驳上面的观点
执行上面的代码,调用function2()前后程序输出的都是1、2,此程序试图通过调用function2()交换d1和d2,但是没有成功,为什么呢?因为d1和d2是值传递,function2()中的d1和d2是test2()函数中d1和d2的副本,调用完function2()不会对test2()中的变量产生影响。再看示例二中,function1()函数内改变的并不是d1和d2本身的值,而是d1和d2指向的对象的值,调用完function1()后d1和d2仍然指向函数调用前的堆地址,即函数参数是栈中的d1和d2,而不是堆中d1和d2指向的对象,即使你在函数中改变了堆中的对象,但没有改变函数参数的值。所以示例二并不是什么引用传递;可见java中只有值传递。
fanfan老师说这里在函数里的引用已经不是外围的引用了。
可以说是传递的是引用副本
参考
更多推荐
请注意,java
发布评论