A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© qxz394731688 中级黑马   /  2016-1-10 11:16  /  643 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

在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值有点不解

4 个回复

倒序浏览
额额,坐等大神解释吧,感觉你的问题不是很清楚
回复 使用道具 举报
你上面得为值传递,为不同的内存地址。而在用类作为参数为引用传递,共用一个内存地址。所以用类会改变啊,b的值
回复 使用道具 举报

抱歉,我不会画图,就拿老师的截图来给你讲一下吧。
首先主方法进栈,开辟两个空间,一个存 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)方法弹栈。
最后得出的结论就是:
        基本类型:形式参数的改变对实际参数没有影响.
        引用类型:形式参数的改变直接影响实际参数.
过程有点复杂,希望我说的够明白。
回复 使用道具 举报
。。。。然而并没有改变原有的值,只是在另一个方法中改了另一个方法的值而已
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马