为了账号安全,请及时绑定邮箱和手机立即绑定

关于java的引用传递和值传递

关于java的引用传递和值传递

慕标5832272 2019-04-13 08:45:14
publicclassTestArray{publicstaticvoidmain(String[]args){//reviseanarraydirectlywithoutreturnString[]test={"test"};voidReturn(test);System.out.println(test[0]);//reviseanarraydirectlywithreturnString[]test2={"test2"};String[]outtest2=arrayReturn(test2);System.out.println(outtest2[0]);//reviseanarraybyanotherwayString[]test3={"test3"};voidReturn2(test3);System.out.println(test3[0]);}publicstaticvoidvoidReturn(String[]a){String[]b={"b"};a=b;System.out.println("ainvoidReturnis"+a[0]);}publicstaticString[]arrayReturn(String[]a){String[]b={"b"};a=b;System.out.println("ainarrayReturnis"+a[0]);returna;}publicstaticvoidvoidReturn2(String[]a){a[0]="b";System.out.println("ainvoidReturn2is"+a[0]);}}输出:ainvoidReturnisbtestainarrayReturnisbbainvoidReturn2isbb在传递一个引用类型的时候,使引用类型指向别的引用类型,为什么在main方法中的值依然不变?(voidReturn方法)作为返回值传出,可以修改,这是什么原理?(arrayReturn)对引用了类型直接修改,可以改变值(voidReturn2)表达的很模糊,大概不明确例子中的值怎么传的。希望可以知道原理和明确的理论,不是只记住这种情况是这样。
查看完整描述

2 回答

?
阿晨1998

TA贡献2037条经验 获得超6个赞

首先,Java都是值传递(passbyvalue)。
所有的"值"(value)都指向一个对象(primitive类型除外,就是本身)
在传递一个引用类型的时候,使引用类型指向别的引用类型,为什么在main方法中的值依然不变?(voidReturn方法)
因为都是value,所以你的只是改了一个value,原来的value以及其所指对象当然都还在。
作为返回值传出,可以修改,这是什么原理?(arrayReturn)
因为你返回的是一个value,这个value指向一个对象,当然也可以修改。
为了方便理解,你可以把这个值当成一个标签(primitive类型当然要除外),或者如果有C/C++的基础,把他们近似的当作pointer/reference。
P.S:Python等语言同理
                            
查看完整回答
反对 回复 2019-04-13
?
撒科打诨

TA贡献1934条经验 获得超2个赞

我喜欢把引用理解为“地址”的概念,引用传值传的是一份“地址的拷贝”,通过“地址的拷贝”修改对象值可以成功,但通过“地址的拷贝”修改地址是不会生效的,所以voidReturn2可以修改,voidReturn不会修改;
至于arrayReturn,可以看成是返回了一个地址,而String[]outtest2=arrayReturn(test2)这句代码会让outtest2拷贝了一份返回的地址,当然是可以取到对象值的。
                            
查看完整回答
反对 回复 2019-04-13
  • 2 回答
  • 0 关注
  • 402 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信