黑马程序员技术交流社区

标题: java常见问题 [打印本页]

作者: qxz394731688    时间: 2016-1-10 11:16
标题: java常见问题
在main方法中调用void方法不会改变main方法中int值

public class testDemo {
        public static void main(String[] args){
                int a=10;
                int b=20;
                System.out.println("a:"+a+",b:"+b);
                change(a,b);
                System.out.println("a:"+a+",b:"+b);
                System.out.println("");
        }
        public static void change(int a,int b){
                System.out.println("a:"+a+",b:"+b);
                a=b;
                b=a+b;
                System.out.println("a:"+a+",b:"+b);
        }
}



但是在类中调用方法却能改变int值有点不解

作者: qq1798555988    时间: 2016-1-10 11:35
额额,坐等大神解释吧,感觉你的问题不是很清楚
作者: 明日蜕变    时间: 2016-1-10 12:09
你上面得为值传递,为不同的内存地址。而在用类作为参数为引用传递,共用一个内存地址。所以用类会改变啊,b的值
作者: 黑色皮肤的马    时间: 2016-1-10 12:09

抱歉,我不会画图,就拿老师的截图来给你讲一下吧。
首先主方法进栈,开辟两个空间,一个存 int a = 10;一个存 int b = 20;
输出 a = 10,b = 20。
接着调用 change(a,b)方法,change(a,b)方法进栈。它的实际参数就是刚才的 int a 和 int b。
在change方法中,b的值赋给了a,a就变成了20。接着把a+b的值赋给了b,b就变成了40,紧接着在change方法中输出 a = 20,b = 40.
然后change方法执行完毕,弹栈,就从栈内存中消失。
再接着主方法中输出a = 10,b = 20.这时请注意,a  和 b  是主方法的局部变量,在主方法中a 和 b 的值并没有发生改变,所以这时还是输出
a = 10,b = 20.
然后在主方法中定义了一个数组 int[] arr,arr是在栈内存中的,但是数组是个引用类型变量,实体是存在堆内存中的。所以在堆内存中就开辟空间,存储数组arr的值,默认都是0.然后显示初始化为1,2,3,4,5。并把地制值赋给栈中的arr。
紧接着调用change(arr)方法,那么这个方法进栈。实际参数就是刚才的arr,也就是把arr的地制值直接传递了过来。这时候是关键,change(arr)也指向了堆内存中的数组实体。然后change(arr)方法把偶数元素变成原来的2倍,这时,数组中的内容就变成了1,4,3,8,5,然后输出arr[1],这时候就是4了。然后change(arr)方法弹栈。
最后得出的结论就是:
        基本类型:形式参数的改变对实际参数没有影响.
        引用类型:形式参数的改变直接影响实际参数.
过程有点复杂,希望我说的够明白。

作者: 549208564    时间: 2016-1-10 14:41
。。。。然而并没有改变原有的值,只是在另一个方法中改了另一个方法的值而已




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2