返回信息流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作为参数没有被改变呢?
这是一条镜像帖。来源:北邮人论坛 / java / #43509同步于 2015/8/14
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Java机器人发帖
方法会对传入其中的参数产生什么影响?
gqk289
2015/8/14镜像同步10 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
你操作的都是局部变量表里的reference,局部变量表里的reference指到了原始的对象,你给他加了一个元素,对象被修改了,这玩意叫做逸出,多线程的时候是很可怕的。i 的局部变量,被你指了一个静态区的对象,方法结束时,两个i不是一个i了,原来的i还是指向了老的字符串,当然不会变
来自「北邮人论坛手机版」
那能否对i或者其他基本类型作为参数时进行修改呢?
我是在刷oj,会用到这方面
【 在 CK 的大作中提到: 】
: 你操作的都是局部变量表里的reference,局部变量表里的reference指到了原始的对象,你给他加了一个元素,对象被修改了,这玩意叫做逸出,多线程的时候是很可怕的。i 的局部变量,被你指了一个静态区的对象,方法结束时,两个i不是一个i了,原来的i还是指向了老的字符串,当然不会变
: 来自「北邮人论坛手机版」
不行,基本类型在java里不是引用,所以传递的是基本类型的值不是引用的值。
void change(int a) {
a = 3;// 并不会改变外面a的值。
}
【 在 gqk289 的大作中提到: 】
: 那能否对i或者其他基本类型作为参数时进行修改呢?
: 我是在刷oj,会用到这方面
Java里面有函数有两种参数传递,传引用和传值
其中,所有Object的Reference,都是通过引用传递,所有primitive类型,都是传值
你上面的情况:
1、List那个,你用add()方法,就是让这个list做了一些行为,改变了他里面的内容,这没什么问题。
2、String这个,在函数体内String i就是局部变量了,开始指向sss,后来指向00000,但是这个局部变量的引用变化并没有影响到原来的引用,这是两份引用。
不知道说清楚了没有,但是事实上你举得例子是不合适的
你应该让List那个测试函数,也写成类似list = list1; 这样,而不是调用list自己的函数。