java中参数传递的问题

lin52p 2009-03-27 12:36:57
public class Test {
public static void main(String[] args) {
StringBuffer a = new StringBuffer("A");
StringBuffer b = new StringBuffer("B");
operate(a,b);
System.out.println(a + "," +b);
}
static void operate(StringBuffer x, StringBuffer y) {
x.append(y);
y =x;
}
}

请我各位大侠为什么上面的a的值会发生改变呢?

而b的值又不变呢?

不是说java中方法传参数都是传值吗??
...全文
595 18 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
woodmen2008 2009-03-29
  • 打赏
  • 举报
回复
建议你画个图
把过程一步一步的画出来
这样很容易理解
izard999 2009-03-29
  • 打赏
  • 举报
回复
我前些时也是被这个问题所困扰着.
记住一点,传参的时候,不管传什么,都是一个copy的过程. 简单点说.就是把实参的值拷贝给形参, 方法里面操纵的只是你的形参, 而对实参一点影响都没有..!
基本数据类型是copy值,对象类型是copy的地址.记住这一点,你上面的问题就很好解决了.
拿你的程序说话吧,关于引用问题5楼已经说的很好了

public class Test {
public static void main(String[] args) {
StringBuffer a = new StringBuffer("A");
StringBuffer b = new StringBuffer("B");
operate(a,b);
System.out.println(a + "," +b);
}
static void operate(StringBuffer x, StringBuffer y) {
x.append(y);
y =x;//这里,只是说明变量y的引用变了,而跟b没有任何关系
}
}

这里, a是指向"A"的.b是指向"B"的.这点应该没有问题.
然而你调用方法的时候把a,b作为参数传进去,那么.这个时候,只是把a的地址copy拷贝给了x,b的地址copy拷贝给了y,
方面里面,x指向的对象发生了变化,变成了"AB",然而a跟x是指向同一个对象的. 下面输出a会是"AB"

关于b,看上面的注释,调试下就知道了,当执行到那句代码时.. 现在是x,y,a都指向"AB"这个对象.而b还是始终指向"B"的,始终没有改变..所以才有你下面那个结果.. 把那句关键的话记住.. 自己再理解下吧
xiaoguangniit 2009-03-29
  • 打赏
  • 举报
回复
当调用operate()时,a,b都是对象,传的是对象的地址, x.append(y)操作的是x的地址,而y=x只是让y指向x的地址,对这个地址没有操作,故它不变化。
herohellon 2009-03-28
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 zhuzhusany 的回复:]
java中方法传参数确实都是传值
当参数是对象引用时仅可以改变引用对象的内部状态,但对参数对象重新赋值是没有意义
所以x.append(y)改变了a指向StringBuffer对象的内容//ok
y=x,将b重新指向其他地址//failure
[/Quote]顶,说明的很清楚,配合1楼的实例,更完美
fanchangyong 2009-03-28
  • 打赏
  • 举报
回复
请看方法实现.
x.append(y); 直接改变了引用x指向的对象的值,也就是实参指向的对象的值(形参实参指向同一对象).
y=x; 改变了y指向的对象,让y指向x指向的对象,但实参(是一个引用)并不会因此而指向别的对象.

楼主需好好理解一下.
jhr924 2009-03-28
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 qzslyh2008 的回复:]
调用operate()的时候
x指向a存储实例的地址
y指向b存储实例的地址
x.append(y);使得a指向的内容变为"AB"
y=x;使得y指向x存储实例的地址(注意b指向的实例地址没有变)
所有在输出System.out.println(a + "," + b)时,实际的输出结果是 AB,B
[/Quote]

说的就可以了
lhylysnet 2009-03-28
  • 打赏
  • 举报
回复
受教!!!!!!
xjun15 2009-03-28
  • 打赏
  • 举报
回复
学习
lliiqiang 2009-03-28
  • 打赏
  • 举报
回复
传入的是地址,并且是值传递
operate方法中
x.append(y); 是在原地址所指向的对象中添加个y,所以原来的对象改变了
y=x,这里的y是传入到方法参数的y指向新的地址,原来外部的方法指向的还是原来的地址对象
AB,B
qzslyh2008 2009-03-27
  • 打赏
  • 举报
回复
调用operate()的时候
x指向a存储实例的地址
y指向b存储实例的地址
x.append(y);使得a指向的内容变为"AB"
y=x;使得y指向x存储实例的地址(注意b指向的实例地址没有变)
所有在输出System.out.println(a + "," + b)时,实际的输出结果是 AB,B
knight2000004 2009-03-27
  • 打赏
  • 举报
回复
引用,不是clone
gao512008 2009-03-27
  • 打赏
  • 举报
回复
STUDY
long9299 2009-03-27
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 zhuzhusany 的回复:]
java中方法传参数确实都是传值
当参数是对象引用时仅可以改变引用对象的内部状态,但对参数对象重新赋值是没有意义
所以x.append(y)改变了a指向StringBuffer对象的内容//ok
y=x,将b重新指向其他地址//failure
[/Quote]
ouyangxiaokang6 2009-03-27
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 zhuzhusany 的回复:]
java中方法传参数确实都是传值
当参数是对象引用时仅可以改变引用对象的内部状态,但对参数对象重新赋值是没有意义
所以x.append(y)改变了a指向StringBuffer对象的内容//ok
y=x,将b重新指向其他地址//failure
[/Quote]
up
suncheng_hong 2009-03-27
  • 打赏
  • 举报
回复
StringBuffer a = new StringBuffer("A");
StringBuffer b = new StringBuffer("B");
执行到这时,内存是这样
a--------------> "A"
b--------------> "B"

operate(a, b);这一部,java参数传递对象时,会生产新的对象,
a---------------------------> "A"
b--------------> "B" |
| |
x-----------------|------------
y-----------------|
x.append(y);执行后,因为a与x都指向"A"的地址
a-----------------"AB"
x------------------|
y = x;执行后 |
y------------------|
所以a为AB,b为"B"



zhuzhusany 2009-03-27
  • 打赏
  • 举报
回复
java中方法传参数确实都是传值
当参数是对象引用时仅可以改变引用对象的内部状态,但对参数对象重新赋值是没有意义
所以x.append(y)改变了a指向StringBuffer对象的内容//ok
y=x,将b重新指向其他地址//failure
JeffreyZhang1314 2009-03-27
  • 打赏
  • 举报
回复
1楼的兄弟说得很清楚了!你只要理解,你在作传值的时候,电脑都作了一些什么!

static  void  operate(StringBuffer  x,  StringBuffer  y)    {  
x.append(y);
y =x;
}

你的operate方法的参数x只是一个可以指向StringBuffer类型变量的引用,你在赋值的时候并不是在向x中装东西,只是将x指向了一个StringBuffer类型的变量。

就解释这么多吧!希望我的解释可以帮助你!
oklinsong 2009-03-27
  • 打赏
  • 举报
回复
因为StringBuffer是对象类型,所以传的是引用,指向实际地址的引用。

62,635

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧