返回信息流void change1(char[] ch)
{
ch[0]='c';
}
void change2(char[] ch)
{
ch=new char[]{xxxx};
}
main()
{
char c[]={xxx};
change1(ch);change2(ch);
}
求分析详细的传参,分配副本,内存分配等 解答这俩函数的效果
这是一条镜像帖。来源:北邮人论坛 / java / #14289同步于 2010/4/28
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Java机器人发帖
求大牛解答问题O(∩_∩)O~
baoyu430
2010/4/28镜像同步13 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
lz只是写的一个伪代码哈?有点乱,我先区别一下几个ch哈
我觉得是这样的
1,从main开始执行的时候,首先在堆里边给数组ch[]分配空间
2,调用change1的时候,先在堆里边给ch1创建一个char型的空间(这儿错了,是应该在栈里边。方法的参数,局部变量都应在栈里边),并指向刚刚创建的ch[],这样参数就传进去了。方法体里边,首先在另外一个地方给静态'c'分配了一个空间,这个时候ch1[0]变来指向了'c',而并没有修改传进来的参数的值。调用完毕,刚刚在堆里的数组ch1由系统自己有空的时候销毁
3,在调用change2的时候,方法change2中的参数,同样也在栈里创建一个char型的数组引用ch2。方法体里边,又new了一个新的数组,放在堆里边,这个时候ch2指向这个新数组。在传参数的时候,本来ch2是指向ch的,结果又指向了new出来的数组。所以,相当于ch在change2中也没有变化。
所以,我觉得这俩方法的效果就是:没有引起任何变化
不知道我的分析对不对....
【 在 baoyu430 (Alice9条~) 的大作中提到: 】
void change1(char[] ch1)
{
ch1[0]='c';
}
void change2(char[] ch2)
{
ch2=new char[]{xxxx};
}
main()
{
char ch[]={xxx};
change1(ch);change2(ch);
}
求分析详细的传参,分配副本,内存分配等 解答这俩函数的效果
你可以这么理解,java中所有的都是值传递,只不过对于对象而言,你拿到的永远都是“引用的值”。因此第一个函数里ch[0]修改是对ch实际做了修改,而第二个里ch=new xxx,这里只是将函数里传进去了ch这个“引用值”做了修改,外面看不到任何改变,因为出了这个函数,没有任何值指向这个引用。不知道说明白了没有。
求解大牛,我的分析错没错?
...
我最近正好学了分析内存,不知道解答的对不对...
【 在 lazytiger (无心云) 的大作中提到: 】
: 你可以这么理解,java中所有的都是值传递,只不过对于对象而言,你拿到的永远都是“引用的值”。因此第一个函数里ch[0]修改是对ch实际做了修改,而第二个里ch=new xxx,这里只是将函数里传进去了ch这个“引用值”做了修改,外面看不到任何改变,因为出了这个函数,没有�
【 在 AimGraduate 的大作中提到: 】
: 求解大牛,我的分析错没错?
: ...
: 我最近正好学了分析内存,不知道解答的对不对...
你的理解不对,你运行一下程序就知道了,第一个其实是改了数据的,第二个没有。在java中对象都是引用方式存在的,包括数组也是对象。因此第一个里ch1并没有分配空间,而只是一个引用值传递,所以函数里修改的就是引用指向本身。
哦,对对,那个只是个引用。
那ch1应该也是在栈里边分配空间了的?
对象和数组都分配在堆里边的。
【 在 lazytiger (无心云) 的大作中提到: 】
: 你的理解不对,你运行一下程序就知道了,第一个其实是改了数据的,第二个没有。在java中对象都是引用方式存在的,包括数组也是对象。因此第一个里ch1并没有分配空间,而只是一个引用值传递,所以函数里修改的就是引用指向本身。
【 在 AimGraduate 的大作中提到: 】
: 哦,对对,那个只是个引用。
: 那ch1应该也是在栈里边分配空间了的?
: 对象和数组都分配在堆里边的。
: ...................
对,所有的值都分配在栈上,对象一定是在堆上,而new得到的只会是一个堆上对象的引用值,这个值在栈上,这个值被销毁和对象被销毁没有关系。
大牛,我还是不明白第一个方法是怎么调用的,这个为啥就改变那个值了阿..
求解
【 在 lazytiger (无心云) 的大作中提到: 】
: 对,所有的值都分配在栈上,对象一定是在堆上,而new得到的只会是一个堆上对象的引用值,这个值在栈上,这个值被销毁和对象被销毁没有关系。