返回信息流java中,如果传一个数组对象进一个方法,然后把它赋值为这个方法中的一个局部数组对象,该方法执行完毕后这个数组对象内容是啥?
我自己做了一个测试,假设a={1,2,3},然后把a作为参数传入一个方法,方法内部有个局部数组b={3,2,1},然后把b赋给a,即a=b。方法未执行完时,我debug查看a的值确实是{3,2,1}了, 但执行完后,我发现a的值仍然是{1,2,3}。按理说,常量或者堆分配的对象,只要还有指针指向它,即使方法退出后也不会消失。如果退出后消失,那a指向的应该也是未知地址,而不是原来的值才对啊。
这是一条镜像帖。来源:北邮人论坛 / java / #42007同步于 2015/6/23
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Java机器人发帖
请教个问题
wan751
2015/6/23镜像同步15 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
唔。如果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没关系啊。
}
传进来的是对象a,而不是a这个对象名。方法的参数名只是一个临时引用/指针,方法结束就抛弃了,和方法外部的a不是一个变量。
把参数名改成c运行结果是一样的,这样可能好理解一点
【 在 wan751 (Core|酷睿大神) 的大作中提到: 】
: java中,如果传一个数组对象进一个方法,然后把它赋值为这个方法中的一个局部数组对象,该方法执行完毕后这个数组对象内容是啥?
: 我自己做了一个测试,假设a={1,2,3},然后把a作为参数传入一个方法,方法内部有个局部数组b={3,2,1},然后把b赋给a,即a=b。方法未执行完时,我d...
: --
相当于是这样:
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。
: ...................
但我发现如果将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运行结果是一样的,这样可能好理解一点
可以这样理解。
数组的引用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;
}
这个解释很清晰。也就是说参数传递形式其实只有一种,就是拷贝一个值,只不过如果这个值是个对象地址,就可以更改原对象的内容而已,即所谓的地址传递。
谢谢哈!
【 在 HBYRQ 的大作中提到: 】
: 可以这样理解。
: 数组的引用a当做参数传给方法test时,实际上是复制出了a的一个引用,我们叫它atm.
: 在test方法内部,atm对a所指对象的遥控扔然生效。但如果你让atm另有所指,它就只能去遥控其它对象了。
: ...................
因为你这两个a不是同一个变量啊。。。
【 在 wan751 的大作中提到: 】
: 相当于是这样:
: int[] a={1,2,3};
: test(a);
: ...................
对,因为数组本身也是指针,指向他的三个子对象,传参的时候只复制了数组对象的引用,没有挨个复制子对象的引用。类似于浅拷贝和深拷贝的区别
【 在 wan751 (Core|酷睿大神) 的大作中提到: 】
: 但我发现如果将a传进来之后,不给它赋另一个对象地址,而是直接修改它的内容,比如
: a[0]=3;
: a[1]=2;
: ...................