请注意,java中没有引用传递

编程入门 行业动态 更新时间:2024-10-28 21:18:37
/*** 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

本文发布于:2023-05-26 08:20:15,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/259564.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:请注意   java

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!