BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / java / #43509同步于 2015/8/14
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Java机器人发帖

方法会对传入其中的参数产生什么影响?

gqk289
2015/8/14镜像同步10 回复
class test{ public void ss(){ String i = "sss"; List<Integer> list = new ArrayList<Integer>(); se(list); sw(i); System.out.println(list.size()); System.out.println(i); } public void se(List<Integer> list){ list.add(1); } public void sw(String i){ i="000000"; } } 上面这个类如果ss方法的话,输出是1和sss,为什么list作为传递参数时被改变了,而i作为参数没有被改变呢?
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
nealwang机器人#1 · 2015/8/14
要看是不是对象,是对象就会被牵扯进去从而改变。不是对象的都是单身狗,单身狗是不会变的。 发自「贵邮」
CK机器人#2 · 2015/8/14
你操作的都是局部变量表里的reference,局部变量表里的reference指到了原始的对象,你给他加了一个元素,对象被修改了,这玩意叫做逸出,多线程的时候是很可怕的。i 的局部变量,被你指了一个静态区的对象,方法结束时,两个i不是一个i了,原来的i还是指向了老的字符串,当然不会变 来自「北邮人论坛手机版」
gqk289机器人#3 · 2015/8/14
那能否对i或者其他基本类型作为参数时进行修改呢? 我是在刷oj,会用到这方面 【 在 CK 的大作中提到: 】 : 你操作的都是局部变量表里的reference,局部变量表里的reference指到了原始的对象,你给他加了一个元素,对象被修改了,这玩意叫做逸出,多线程的时候是很可怕的。i 的局部变量,被你指了一个静态区的对象,方法结束时,两个i不是一个i了,原来的i还是指向了老的字符串,当然不会变 : 来自「北邮人论坛手机版」
aiquestion机器人#4 · 2015/8/14
不行,基本类型在java里不是引用,所以传递的是基本类型的值不是引用的值。 void change(int a) { a = 3;// 并不会改变外面a的值。 } 【 在 gqk289 的大作中提到: 】 : 那能否对i或者其他基本类型作为参数时进行修改呢? : 我是在刷oj,会用到这方面
icyfox机器人#5 · 2015/8/14
Java里面有函数有两种参数传递,传引用和传值 其中,所有Object的Reference,都是通过引用传递,所有primitive类型,都是传值 你上面的情况: 1、List那个,你用add()方法,就是让这个list做了一些行为,改变了他里面的内容,这没什么问题。 2、String这个,在函数体内String i就是局部变量了,开始指向sss,后来指向00000,但是这个局部变量的引用变化并没有影响到原来的引用,这是两份引用。 不知道说清楚了没有,但是事实上你举得例子是不合适的 你应该让List那个测试函数,也写成类似list = list1; 这样,而不是调用list自己的函数。
CK机器人#6 · 2015/8/14
在刷oj也要考虑代码规范嘛…总这样写代码,多线程的时候出错了都找不到为什么… 来自「北邮人论坛手机版」
gqk289机器人#7 · 2015/8/14
讲得很清楚,谢谢 【 在 icyfox 的大作中提到: 】 Java里面有函数有两种参数传递,传引用和传值 其中,...
LNAmp机器人#8 · 2015/8/14
Java里只有一种传参方式:值传递
nuanyangyang机器人#9 · 2015/8/14
list没有改变:list仍然指向原来那个ArrayList对象。 改变了的是那个ArrayList对象的内容,而不是list变量。