2 u010775468 u010775468 于 2016.04.19 15:29 提问

JAVA中函数的参数值的传递问题

在学习java中,遇到这样一个问题
class PasasVale{
public static void main(String [] args){
int x = 5;
change(x);
System.out.println(x);
public static void public change(int y){
y =3;
}
}
}
输出结果为5;
还有一个例子
class PasasVale{
public static void main(String [] args){
PassVale obj = PassVale();
obj.x = 5;
change(obj);
System.out.println(x);
public static void public chang(obj){
obj. y =3;
}
}
}
输出结果为3
也就是说结果被更改了
在分析里是这样说的,第一个例子,刚开始,main中的值为5,然后change中的值未定,然后传值,两个都为5,然后在change中修改了值为3,然后原来main中的值还是5,所以输出来为5
第二个例子,是引用了堆和栈的概念,说原来在栈中main中obj中存一个地址,然后指向堆内存中的5,这时,change值未定,然后又传值,这时change中却传的是地址,也指向了堆中的这个5,然后修改,然后就变了
我不明白的是为什么第一个例子里没有这麽做。第二个却在堆栈中操作了,难道两个例子的修改值不在一个层面上吗,求解答,谢谢

5个回答

magicioney
magicioney   2016.04.19 15:37

第一次,你做的工作基本是这样:你有一根线,线的名字叫x,线的尽头绑着一个数字,数字是5,。你呢叫来一个人,把5给他了。他呢拿了一根线,线的名字叫y,他把这根线绑在了5上。然后他从兜里掏出一个数字,3。然后把他那根叫y的线解开了,重新绑到了3上。然后他跟你说完事了。你一拉你得线,拉出来的还是5。
第二次,你还是有一根线,名字叫obj。这个obj是个盒子,盒子里有一个线,叫x。绑着5。你又把他给人了,那人也用一个叫obj的线绑盒子上(虽然名字相同,单并不是同一根线)然后他一拉线拿出盒子来,盒子里不是有根线x么,他解开,绑了一个3上去。然后告诉你完事了。你一拉你得线,拿到一个盒子,再拉盒子里的线,拿到的就是3了。

u010775468
u010775468 还有基本数据类型他是存放在栈内存里的,所以传递的是值,而应用传地址,所以会修改值,是这样,吗?
一年多之前 回复
u010775468
u010775468 我刚才查了下,第一个例子是传递的基本数据类型,也就是在栈的基础上操作的,而第二个是传递的是引用数据类型,所以会牵扯到堆栈的操作,可以这样理解吗?
一年多之前 回复
magicioney
magicioney 回复键盘手C: java里传递的都是对象,你要着眼于对象的去向以及变化。不要关注变量名。
一年多之前 回复
magicioney
magicioney 回复键盘手C: 都有,线就是栈里的地址,通过这个地址能找到堆里的某个对象。
一年多之前 回复
u010775468
u010775468 恩,差不多懂了,但是为什么第二个例子当中会有堆栈的概念呢,难道第一个例子没有嘛?
一年多之前 回复
magicioney
magicioney   2016.04.19 15:40

第二次,你得obj绑着一个盒子,- - 写着写着就飞了……

CSDNXIAOD
CSDNXIAOD   2016.04.19 15:45

参数值的传递不是函数的任务!
----------------------biu~biu~biu~~~在下问答机器人小D,这是我依靠自己的聪明才智给出的答案,如果不正确,你来咬我啊!

qq_25859403
qq_25859403   2016.04.19 16:03

图片说明

Mingyueyixi
Mingyueyixi   2016.04.19 16:33

第一问。
int x = 5;
change(x);将参数x(引用地址),而不是值5,传递到这个方法中。
x改头换面,摇身一变化妆成y,在这个方法中。将5这个值赋给y,也就是赋给了x。
只是画了一下妆。

第二问。
传进来的是一个对象。这个对象.x,对象.y 是两个不同的参数,改变x 当然不会影响y,反之亦然。

Mingyueyixi
Mingyueyixi 再具体点就是,123456789这种东东在常量池中,有其地址。赋值就是将这个地址扔给变量(x,y)。大概就是这样,有些毛病,不是很严谨
一年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!