开发者社区> 问答> 正文

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,然后修改,然后就变了
我不明白的是为什么第一个例子里没有这麽做。第二个却在堆栈中操作了,难道两个例子的修改值不在一个层面上吗,求解答

展开
收起
蛮大人123 2016-06-12 18:09:45 2563 0
2 条回答
写回答
取消 提交回答
  • Java方法参数的传递是按值传递,如果参数是一个对象实例。则这个参数值为对象内存地址的首地址。
    2019-07-17 19:34:52
    赞同 展开评论 打赏
  • 我说我不帅他们就打我,还说我虚伪

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

    2019-07-17 19:34:52
    赞同 展开评论 打赏
问答分类:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
Spring Cloud Alibaba - 重新定义 Java Cloud-Native 立即下载
The Reactive Cloud Native Arch 立即下载
JAVA开发手册1.5.0 立即下载