谁帮我解释下这个小程序的输出

zhangqingqi 2005-04-26 04:28:27
看下面这段java程序:

====================================

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;
}
}

====================================

为什么输出的是"AB,B",为什么不是"AB,AB"或者"A,B"呢?

如果说:在void函数里,不能改变其reference参数指向,只能改变其内容,那下面这段程序又如何解释呢:

====================================

public class Test{
public static void main(String[] args) {
String a = new String("A");
String b = new String("B");
operate(a,b);
System.out.println(a + "," +b);
}
static void operate(String x, String y) {
x.concat(y);
y = x;
}
}

====================================

为什么又输出"A,B"呢?
...全文
286 32 打赏 收藏 转发到动态 举报
写回复
用AI写文章
32 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhangqingqi 2005-04-29
  • 打赏
  • 举报
回复
<font size=5>测试一下</font>
</Content>
fdajkfdja fdajfksjafda
nothininmmind 2005-04-28
  • 打赏
  • 举报
回复
那么说,在一个方法的参数列表里的x, y, 只是调用方法时新创建的指针?
也就是相当于StringBuffer x = a;StringBuffer y = b; x, y, 和a,b, 是相互独立的?
请问各位是这样吗?
zhangqingqi 2005-04-27
  • 打赏
  • 举报
回复
wearetheone(beehead)
唧唧歪歪,像个女人,BS你
wearetheone 2005-04-27
  • 打赏
  • 举报
回复
b死楼主,实在是不可理喻,我对朋友也最多说“废话”,你还“简直废话”,我要在这里说:“你简直是不厚道。”连最基本的礼貌都不懂!我这样没骂你吧!希望你好好动动你作为一个程序员的大脑!
jihanzhong 2005-04-26
  • 打赏
  • 举报
回复
1楼就已经回答了。


StringBuffer是可变的,String是不可变的Strings are constant; their values cannot be changed after they are created.


x.append (y); //append是StringBuffer的方法;

x.concat(y); //concat是String的方法

kumishow 2005-04-26
  • 打赏
  • 举报
回复
java的参数是值传递而已,本身并没有被修改,所以在operate(a,b);中a和b都没被改掉,在println中还是原来的值,而且string是不可变的,一定义后该对象本身就固定了, concat后产生的是一个新的string对象,stringbuffer是可变的,可以对其本身进行修改,append后还是本身那个对象,

大家看我说的到底对不对,学习中...
sutdy 2005-04-26
  • 打赏
  • 举报
回复
路过学习。。。
BabyWhite 2005-04-26
  • 打赏
  • 举报
回复
见http://community.csdn.net/Expert/topic/3960/3960063.xml?temp=.2276575
如果楼主编过C++,那么……

在上面的代码中
operate函数原型等于C++里的:
static void operate(StringBuffer *x, StringBuffer *y) ;
(假设C++里有StringBuffer这种数据类型)
然后通过operate(&a, &b)调用
a,b实际上都是指向某个StringBuffer的指针
调用operate函数时是将两个与a,b指向相同StringBuffer对象的两个新的指针传递到函数内部
对新的指针进行操作
所以用x.append()能改变a和x共同指向的那个对象
但y=x改变的是y指针,不改变b指针

而楼主原来对该代码的理解则是:
operate函数原型等于C++里的:
static void operate(StringBuffer &x, StringBuffer &y) ;
然后通过opearte(a,b)调用
hero9690 2005-04-26
  • 打赏
  • 举报
回复

pgemini1981(氷珏焱)

你的java学的真强啊!!
给我一些学习java 的经验啊!!
我才刚学习java啊!!!
不知道怎么学习她~~~~脑子里一头雾水不知道从何下手啊~~~~
555555555
望给以点学习的经验之谈~~~~
谢谢~~~
zhangqingqi 2005-04-26
  • 打赏
  • 举报
回复
api文档里的确是有
因为我英文不好,所以看的就不是很耐心
今后应该加强这方面的学习了
zhangqingqi 2005-04-26
  • 打赏
  • 举报
回复
多谢各位热心帮忙
现在我似乎明白了,最关键是这句:
String类是字符串常量,是不可更改的常量。而StringBuffer是字符串变量,它的对象是可以扩充和修改的。
明天上班结帖
Salten 2005-04-26
  • 打赏
  • 举报
回复
哦。不好意思。我忘了把那行删掉了。呵呵。希望能说明一些问题。
pgemini1981 2005-04-26
  • 打赏
  • 举报
回复
public class Test{
public static void main(String[] args) {
StringBuffer a = new StringBuffer("A");
StringBuffer b = new StringBuffer("B");
operate(a, b); // main里的引用 "a", "b"复制过后 赋给 operate 里的 "x", "y"
System.out.println(a + "," +b);
}
static void operate (StringBuffer x, StringBuffer y) {
x.append (y); // 直接在x 指向的内存区域后加上 y 指向的内容
// 此时 x 指向区域的内容已经改变,(和main 里的"a"指向同一区域)
y = x; // 将 引用"x" 赋给"y" (不是将"x"指向的内容赋给"y"指向的区域)
// 此时"x", "y" 和main里的 "a"指向同一块区域,main里的 "b"本身和其指向的内容都没有变化
}
}
====================================

public class Test{
public static void main(String[] args) {
String a = new String("A");
String b = new String("B");
operate(a,b);
System.out.println(a + "," +b);
}
static void operate(String x, String y) {
x.concat(y); // 唯一和上面不同的就是这一步,首先jvm会分配一个新的内存空间"*1",
// 然后在"*1"的后面加上引用"y"指向的内容。
// 此时 "x" 和 "x" 指向的内容都没有改变
// 另:如果是 x = x.concat(y); 则会将 "x"指向 "*1",但是x原来指向的内容还是不会改变
y = x;
}
}

====================================
MARS.nEIL 2005-04-26
  • 打赏
  • 举报
回复
楼上的第一个程序输出结果为:
AB,AB
AB,AB
因为加了b=a.
Salten 2005-04-26
  • 打赏
  • 举报
回复

就是String定义的是一个字符常量。是不可以改变的。就像 nimifeng(现在只想学点东西) 例子中:

在main里,string = hello. 传给str的时候,则:string,str都等于"hello",而且指向同一内存空间。

如果执行:str = "World";后,str 的值就是World了,可是不能改变string的值。

而StringBuffer是动态分配内存空间的。所以1楼的代码就改变了x,y的值。但是由于作用域的不同,y等于了"AB",但是并没有改变b得值。b还是"B"。

这段代码希望队楼主有帮助:

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

System.out.println(x+ "," + y);
}
}

输出结果:
AB,AB
AB,B

这段代码:
public class haha
{
public static void main(String[] args) {
StringBuffer a = new StringBuffer("A");
StringBuffer b = new StringBuffer("B");
operate(a, b);
b = a;
System.out.println(a + "," +b);
}
static void operate (StringBuffer x, StringBuffer y) {
x.append (y);
y = x;

System.out.println(x+ "," + y);
}
}

输出结果:
AB,AB
AB,AB

我刚学Java不久。如果我说的不对还请各位见谅。
MARS.nEIL 2005-04-26
  • 打赏
  • 举报
回复
String类是字符串常量,是不可更改的常量。而StringBuffer是字符串变量,它的对象是可以扩充和修改的。

public class Test {
public static void test(String str) {
str = "World";
}
public static void main(String[] args) {
String string = "Hello";
test(string);
System.out.println(string);
}
}
  运行结果:

Hello
  为什么会这样呢?因为参数 str 是一个引用,而且它与 string 是不同的引用,虽然它们都是同一个对象的引用。str = "World" 则改变了 str 的值,使之指向了另一个对象,然而 str 指向的对象改变了,但它并没有对 "Hello" 造成任何影响,而且由于 string 和 str 是不同的引用,str 的改变也没有对 string 造成任何影响,结果就如例中所示。


waterwash 2005-04-26
  • 打赏
  • 举报
回复
sorry先,在加无语~!
thrive_li 2005-04-26
  • 打赏
  • 举报
回复
l楼主不看API,我所说的是拷贝的API的原语,楼主竟然说API不对,我无语.....
好好看看Api吧.
zhangqingqi 2005-04-26
  • 打赏
  • 举报
回复
我对事不对人
nimifeng(现在只想学点东西),第一回回复确实很无聊
我也没骂他

waterwash(水洗)
希望你的下次回复最好是关于问题的
不要再在这个问题上纠缠了

每个人的性格不一样
比如你看我说了别人的回复是废话很不爽
而我则看了别人回复是我明显知道很不爽

谁都无法要求别人完全符合自己的标准
来csdn只想讨论问题
raykiwang 2005-04-26
  • 打赏
  • 举报
回复
找手册来看一下
String类和concat()方法
StringBuffer类和append()方法
加载更多回复(12)

62,614

社区成员

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

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