BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / java / #42007同步于 2015/6/23
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Java机器人发帖

请教个问题

wan751
2015/6/23镜像同步15 回复
java中,如果传一个数组对象进一个方法,然后把它赋值为这个方法中的一个局部数组对象,该方法执行完毕后这个数组对象内容是啥? 我自己做了一个测试,假设a={1,2,3},然后把a作为参数传入一个方法,方法内部有个局部数组b={3,2,1},然后把b赋给a,即a=b。方法未执行完时,我debug查看a的值确实是{3,2,1}了, 但执行完后,我发现a的值仍然是{1,2,3}。按理说,常量或者堆分配的对象,只要还有指针指向它,即使方法退出后也不会消失。如果退出后消失,那a指向的应该也是未知地址,而不是原来的值才对啊。
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
aiquestion机器人#1 · 2015/6/23
唔。如果code是: int[] a = {1,2,3};// a是一个引用 指向{1,2,3} test(a);// 要进入test方法,把a的值付给test方法的参数b。 public void test(int[] b){ // b 指向1,2,3 b = {3,2,1}; // b 指向3.2.1 // 但是和a没关系啊。 }
dss886机器人#2 · 2015/6/23
传进来的是对象a,而不是a这个对象名。方法的参数名只是一个临时引用/指针,方法结束就抛弃了,和方法外部的a不是一个变量。 把参数名改成c运行结果是一样的,这样可能好理解一点 【 在 wan751 (Core|酷睿大神) 的大作中提到: 】 : java中,如果传一个数组对象进一个方法,然后把它赋值为这个方法中的一个局部数组对象,该方法执行完毕后这个数组对象内容是啥? : 我自己做了一个测试,假设a={1,2,3},然后把a作为参数传入一个方法,方法内部有个局部数组b={3,2,1},然后把b赋给a,即a=b。方法未执行完时,我d... : --
beiyourener机器人#3 · 2015/6/23
a作为参数传递到test方法是,传入的难道不是引用么?
wan751机器人#4 · 2015/6/23
相当于是这样: int[] a={1,2,3}; test(a); public void test(int[] a){ int[] b={3,2,1}; a=b; } 执行完test后,a是指向b的内存区域,但我发现最后a仍是{1,2,3},也就是a的初始值,并没有变。 【 在 aiquestion 的大作中提到: 】 : 唔。如果code是: : int[] a = {1,2,3};// a是一个引用 指向{1,2,3} : test(a);// 要进入test方法,把a的值付给test方法的参数b。 : ...................
wan751机器人#5 · 2015/6/23
但我发现如果将a传进来之后,不给它赋另一个对象地址,而是直接修改它的内容,比如 a[0]=3; a[1]=2; a[2]=1; 则方法结束后,a的值确实会变成{3,2,1}了。 但如果我在方法内部实例化一个数组b={3,2,1},然后a=b。此时等方法结束后,a的值却没有变成{3,2,1}。 【 在 dss886 的大作中提到: 】 : 传进来的是对象a,而不是a这个对象名。方法的参数名只是一个临时引用/指针,方法结束就抛弃了,和方法外部的a不是一个变量。 : 把参数名改成c运行结果是一样的,这样可能好理解一点
HBYRQ机器人#6 · 2015/6/23
可以这样理解。 数组的引用a当做参数传给方法test时,实际上是复制出了a的一个引用,我们叫它atm. 在test方法内部,atm对a所指对象的遥控扔然生效。但如果你让atm另有所指,它就只能去遥控其它对象了。 举个栗子: //传入参数a = {1,2,3},方法运行后a[0] = 3 static void var1(int[] atm){ atm[0] = 3;// atm 和 a 指向相同的内容 } //传入参数a = {1,2,3},方法运行后a[0] = 1 因为atm管不着它了 static void var2(int[] atm){ atm = new int[3];// atm 指向了新的东西 atm[0] = 3; }
wan751机器人#7 · 2015/6/23
这个解释很清晰。也就是说参数传递形式其实只有一种,就是拷贝一个值,只不过如果这个值是个对象地址,就可以更改原对象的内容而已,即所谓的地址传递。 谢谢哈! 【 在 HBYRQ 的大作中提到: 】 : 可以这样理解。 : 数组的引用a当做参数传给方法test时,实际上是复制出了a的一个引用,我们叫它atm. : 在test方法内部,atm对a所指对象的遥控扔然生效。但如果你让atm另有所指,它就只能去遥控其它对象了。 : ...................
aiquestion机器人#8 · 2015/6/23
因为你这两个a不是同一个变量啊。。。 【 在 wan751 的大作中提到: 】 : 相当于是这样: : int[] a={1,2,3}; : test(a); : ...................
dss886机器人#9 · 2015/6/24
对,因为数组本身也是指针,指向他的三个子对象,传参的时候只复制了数组对象的引用,没有挨个复制子对象的引用。类似于浅拷贝和深拷贝的区别 【 在 wan751 (Core|酷睿大神) 的大作中提到: 】 : 但我发现如果将a传进来之后,不给它赋另一个对象地址,而是直接修改它的内容,比如 : a[0]=3; : a[1]=2; : ...................