java 参数传递是值传递还是引用传递?

firebird44 2008-05-10 01:34:39
下面代码 输出 AB,B 这是为什么?

如果引用类型是值传递应该是 A,B
如果引用类型是引用传递应该是 AB,AB

但为什么是AB,B


public class Foo{
public static void main(String sgf[]){
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;
}
}
What is the result?
A. The code compiles and prints "A.B".
B. The code compiles and prints "A.A".
C. The code compiles and prints "B.B".
D. The code compiles and prints "AB.B".
E. The code compiles and prints "AB.AB".
...全文
508 30 打赏 收藏 转发到动态 举报
写回复
用AI写文章
30 条回复
切换为时间正序
请发表友善的回复…
发表回复
xql80329 2008-05-12
  • 打赏
  • 举报
回复
这个更能说明问题
class Obj{
String str = "init value";
public String toString(){
return str;
}
}
public class ObjRef{
Obj aObj = new Obj();
int aInt = 11;
public void changeObj(Obj inObj){
inObj.str = "changed value";
}
public void changePri(int inInt){
inInt = 22;
}
public static void main(String[] args)
{
ObjRef oRef = new ObjRef();

System.out.println("Before call changeObj() method: " + oRef.aObj);
oRef.changeObj(oRef.aObj);
System.out.println("After call changeObj() method: " + oRef.aObj);
System.out.println("==================Print Primtive=================");
System.out.println("Before call changePri() method: " + oRef.aInt);
oRef.changePri(oRef.aInt);
System.out.println("After call changePri() method: " + oRef.aInt);
}
}

/* RUN RESULT
Before call changeObj() method: init value
After call changeObj() method: changed value
==================Print Primtive=================
Before call changePri() method: 11
After call changePri() method: 11
*
*/
wangxiaoyes7816 2008-05-12
  • 打赏
  • 举报
回复
y=x
X引用的对象赋值给Y也就是说这个时候X与Y引用指向同一个对象
burningice44 2008-05-12
  • 打赏
  • 举报
回复
简单类型传递的是值;
引用类型传递的是引用。
xql80329 2008-05-12
  • 打赏
  • 举报
回复
这样可以看的更清楚
public class Test3 {


public Test3(){}

public String operate(StringBuffer x, StringBuffer y)
x.append(y);
y = x;
return x+","+y;
}
public static void main(String args[]){
Test3 t = new Test3();
StringBuffer a = new StringBuffer("A");
StringBuffer b = new StringBuffer("B");
System.out.println(a + "," + b); //
String ss = t.operate(a,b);
System.out.println(ss); //
System.out.println(a + "," + b);//


}
}
jingulang 2008-05-12
  • 打赏
  • 举报
回复
书上说
有值传递和引用传递两种方式
不过没搞明白
xql80329 2008-05-12
  • 打赏
  • 举报
回复
y=x 这句你就没用到
程序的色彩 2008-05-12
  • 打赏
  • 举报
回复
值传递
firebird44 2008-05-11
  • 打赏
  • 举报
回复
学无止境
blazingfire 2008-05-11
  • 打赏
  • 举报
回复
ab.b
static void operate(StringBuffer x, StringBuffer y) {
x.append(y);//修改x对象中的内容
y = x;//这一句对于调用者来说没有什么作用
}
ks_ly 2008-05-11
  • 打赏
  • 举报
回复
学习
cl55 2008-05-11
  • 打赏
  • 举报
回复
operate(a,b);
这样就可以把a,b的地址传过去怎么还说是传值???

java 对于非原始类型都是传址的!!!


c 是传值的,如想传址要明确写出取址。 如:
operate(&a,&b);
chenhongxin 2008-05-11
  • 打赏
  • 举报
回复
public class Foo{
public static void main(String sgf[]){
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;
}
}
What is the result?
A. The code compiles and prints "A.B".
B. The code compiles and prints "A.A".
C. The code compiles and prints "B.B".
D. The code compiles and prints "AB.B".
E. The code compiles and prints "AB.AB".
Jaybin 2008-05-11
  • 打赏
  • 举报
回复
其实都是值传递
ThirdDimension 2008-05-11
  • 打赏
  • 举报
回复

Java操作的都是变量引用的对象。
如果操作时,修改了对象,则会引起所有指向它的变量
如果只是更改了指向,则不会改变其他变量指向以前的。


那个 y 是一个局部变量。
xshy3412 2008-05-11
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 Inhibitory 的回复:]
java 参数传递是值传递还是引用传递?

最根本还是值传递, 当我们传递内建数据类型, 如int, float等时, 直接复制他们的值, 这个没有任何疑问.

但当我们传递一个对象的引用时到一个函数中时, 可以在那个函数中修改这个对象的成员属性的值.
有些人在此也许有疑问, 到底这里是值传递还是引用? 实际是这里传递的是那个对象的引用的副本, 即复制了一份那个对象的引用, 然后传递给函数使用.
但是既然传递了副本, 又怎么能够…
[/Quote]
storm_mxj 2008-05-10
  • 打赏
  • 举报
回复
xuexi
zjhlht 2008-05-10
  • 打赏
  • 举报
回复
学习!~~~
ecbeach 2008-05-10
  • 打赏
  • 举报
回复
恭喜楼上的答对了
asxiaoning 2008-05-10
  • 打赏
  • 举报
回复
各位,也就是说
x.append(y);//这段代码的作用是改变对象的操作
y=x;//而这段代码只是改变引用的操作
是这个意思吗?
Inhibitory 2008-05-10
  • 打赏
  • 举报
回复
java 参数传递是值传递还是引用传递?

最根本还是值传递, 当我们传递内建数据类型, 如int, float等时, 直接复制他们的值, 这个没有任何疑问.

但当我们传递一个对象的引用时到一个函数中时, 可以在那个函数中修改这个对象的成员属性的值.
有些人在此也许有疑问, 到底这里是值传递还是引用? 实际是这里传递的是那个对象的引用的副本, 即复制了一份那个对象的引用, 然后传递给函数使用.
但是既然传递了副本, 又怎么能够修改那个对象的数据呢?
例如:
ref1指向对象 obj,
作为函数的参数传递过去时, 传递的是ref1的副本: ref2
其实ref2这时也是指向对象 obj, 因为引用实际上是对象的内存地址值.
这样, 两个不同的引用ref1, ref2都是指向同一个内存地址, 所以可以修改对象的数据成员的值.
所以, 这里可以看出, 实际上传递的还是值, 而非传递了引用ref1, 而是复制ref2来传递的.

结论: Java中没有所谓的引用传递, 只有唯一的值传递.
加载更多回复(10)

62,614

社区成员

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

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