为什么输出的不是"AB","AB"

shiyuqian 2008-04-21 04:09:08
public class Foo
{
public static void main (String [] args)
{
StringBuffer a = new StringBuffer ("A");
StringBuffer b = new StringBuffer ("B");
operate (a,b);
System.out.print(a + "," + b);
}
static void operate (StringBuffer x, StringBuffer y)
{
x.append(y) ;
y = x;
}
}
...全文
432 40 打赏 收藏 转发到动态 举报
写回复
用AI写文章
40 条回复
切换为时间正序
请发表友善的回复…
发表回复
shiyuqian 2008-04-23
  • 打赏
  • 举报
回复
我明白了,谢谢谢谢!
老紫竹 2008-04-22
  • 打赏
  • 举报
回复
 y = x;  


这句话是没有作用的,你去掉它就看得更清楚了!

huxinyu929 2008-04-22
  • 打赏
  • 举报
回复
很基础的题。
此类问题只要了解内存中的工作(管它引用拷贝,太学院了。)就噢可了。
wanhao3g 2008-04-22
  • 打赏
  • 举报
回复
传参的问题。

x.append(y) 这个 对传入的地址的值做了修改,y=x没有对y原来指向的地址(b指向的地址)的值作修改,而是使y指向了新的地址,b指向的地址不变,所以是B.
public class Test3 {
public static void main (String [] args)
{
StringBuffer a = new StringBuffer ("A");
StringBuffer b = new StringBuffer ("B");
operate (a,b);
System.out.print(a + "," + b);
}
static void operate (StringBuffer x, StringBuffer y)
{
x.append(y) ;
y.deleteCharAt(0).insert(0,x);
}

}
Cspider588 2008-04-22
  • 打赏
  • 举报
回复
很简单,java中以对像为参数的时候,传进去的是对象引用的一份拷贝。

当对象改变的时候,自然打印出来的是改变的,也就是x.append(y)的效果

而y = x只是把y这个引用的拷贝的内容变成了x,但是外部的引用b没有发生改变,引用的对象也没有改变。
den88 2008-04-22
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 wang8118 的回复:]
Java codepublic 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.deleteCharAt(0).append("C");
}


结果是…
[/Quote]
xiaoliu216 2008-04-22
  • 打赏
  • 举报
回复
8楼说得好。学习了
cnjzy0106 2008-04-22
  • 打赏
  • 举报
回复
引用调用问题!
当调用operate(a, b)方法的时候是吧a,b的地址存放到x,y中,operate 中 x.append(y)是吧a地址中的值改变了所以a的值是:AB
y = x;是把y的指向了x的地址而b地址里面的值没有变化所以b的值是:B
所以输出 AB,B


tboqi 2008-04-22
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 anqini 的回复:]
Java codepublicclassTest2 {publicstaticvoidmain(String[] args) {
StringBuffer a=newStringBuffer("A");
StringBuffer b=newStringBuffer("B");
operate(
a,
b);//因为你在方法operate内部对a的属性改变了,所以这里a输出AB//你在方法operate内部只是把b引用指向了x(a),但是方法结束后引用会重新指向之前的那个地址块,也就是说b!但是咱们在方法内部没有对引用b(y)指向的…
[/Quote]正解
ErnestLu 2008-04-22
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 abc130314 的回复:]
在JAVA中,类型为类的变量,保存的都是类的对象的引用。
x.append(y) ; //改变了 x引用的类的对象。
y = x; //只是改变了y的引用,并没有改变 y引用的对象。
(y和b 虽然有同一个对象的引用。但,他们是两个变量,不是一个,所以,改变y的引用,根本没法改变b的引用)
[/Quote]
最容易理解
realduke2000 2008-04-22
  • 打赏
  • 举报
回复
如果该类型为值类型,哪么就作为形参,在函数内部的行为不改变参数的值。
如果为引用类型,哪么应该输出你所说的结果
realduke2000 2008-04-22
  • 打赏
  • 举报
回复
又不是构造方法,在什么地方调用的?
KKK2007 2008-04-22
  • 打赏
  • 举报
回复
public class Foo
{
public static void main (String [] args)
{
StringBuffer a = new StringBuffer ("A");
StringBuffer b = new StringBuffer ("B");
operate (a,b); //a=x="AB",虽然y的直也改变了,由于y是引用,所以b的直不变
//a="AB",b="B"
System.out.print(a + "," + b);
}
static void operate (StringBuffer x, StringBuffer y) //x=a="A" y=b="B"
{
x.append(y) ;//x=a="AB" y=b="B"
y = x; //x="AB" y=x="AB",y的应用指向x也就是a,但是并没有改变b的直“ B”
}
}
SBtoSB 2008-04-22
  • 打赏
  • 举报
回复

static void operate(StringBuffer x, StringBuffer y)
{
x.append( y );
y = x;//其实这里应该这样理解,y是x的另外一个引用
x.append(" 1111111 ");
}

最后输出应该是
AB11111111,B
SBtoSB 2008-04-22
  • 打赏
  • 举报
回复
[Quote=引用 31 楼 java2000_net 的回复:]
Java code y = x;



这句话是没有作用的,你去掉它就看得更清楚了!
[/Quote]

NO///在方法体内还是有作用的
huanlingpiaohun 2008-04-22
  • 打赏
  • 举报
回复
mark
採石 2008-04-21
  • 打赏
  • 举报
回复
没想到有这么多奥秘
unwritewolf 2008-04-21
  • 打赏
  • 举报
回复
学习·····
jiazhengjing 2008-04-21
  • 打赏
  • 举报
回复
问下,如果要通过函数改变b,怎么做?
richard_2010 2008-04-21
  • 打赏
  • 举报
回复
5l,8l
加载更多回复(20)

62,623

社区成员

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

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