为什么输出是Hello?而不是Hello World?

xuwenhao2002 2008-04-23 06:31:21
public class Test {
public static StringBuffer doSomething(StringBuffer buff) {
buff = new StringBuffer();
buff.append("Hello World");
return buff;
}

public static void main(String[] args) {
StringBuffer buff = new StringBuffer();
buff.append("Hello");
doSomething(buff);
System.out.println(buff);
}
}
...全文
549 59 打赏 收藏 转发到动态 举报
写回复
用AI写文章
59 条回复
切换为时间正序
请发表友善的回复…
发表回复
ccbianshen 2008-04-30
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 coolhty 的回复:]
楼上正确。。。你调用上面那个静态函数,返回的字符串根本就没用变量接收,下面打印buff还是主函数里面的。。

你用buff= doSomething(buff); 就可以打印出最经典的Hello World
[/Quote]
hehe
hwxiang 2008-04-27
  • 打赏
  • 举报
回复

以我的想法就是,分析内存,从main()开始,首先是程序加载到code segment 中,
首先为static 变量创建对象和分配内存空间,如图 Data segment 主要是存放 静态变量和字符串和常量,
创建了一个StringBuffer buff分配在栈内存中 就是我给出的图片中的 stack 区, 然后 new StringBuffer();对象,在堆内存中,如图 heap 区.

buff调用append方法传 "Hello"进来 ,

doSomething(buff);//调用doSomething 方法传一个StringBuffer 类型 参数为buff 进入 doSomething方法体,new 一新 StringBuffer对象并且调用 append方法,值为 "Hello World",return buff;反大括号,

局部变量消失,也就是说 doSomething 方法体内的 buff对象消失.
最后print main 方法中的 buff对象的值。

=======
个人观点,不对的地方还得请大家指出来。
michelecindy 2008-04-27
  • 打赏
  • 举报
回复
你在调用了那个方法后需要重新赋值给buff才能得到新的值
ykendy 2008-04-27
  • 打赏
  • 举报
回复
就凭我的直觉都知道肯定是hello了。。^_^
xiaoqiao21 2008-04-27
  • 打赏
  • 举报
回复
你往dosomething里传递的只是对象引用的复制啊~
SKY138421 2008-04-27
  • 打赏
  • 举报
回复
public class Test {
public static StringBuffer doSomething(StringBuffer buff) {
buff.append("Hello World");
return buff;
}

public static void main(String[] args) {
StringBuffer buff = new StringBuffer();
buff.append("Hello");
doSomething(buff);
System.out.println(buff);
}
}
或者
public class Test {
public static StringBuffer doSomething(StringBuffer buff) {
buff = new StringBuffer();
buff.append("Hello World");
return buff;
}

public static void main(String[] args) {
StringBuffer buff = new StringBuffer();
buff.append("Hello");
buff = doSomething(buff);
System.out.println(buff);
}
}
christy_jin 2008-04-27
  • 打赏
  • 举报
回复
暈,偶白學了!
Coder211 2008-04-26
  • 打赏
  • 举报
回复
支持8楼 !
Coder211 2008-04-26
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 anqini 的回复:]

public class Test {
public static StringBuffer doSomething(StringBuffer buff) {
buff = new StringBuffer(); //buff重新指向另一个对象,
buff.append("Hello World"); //对其进行修改!
return buff; //返回这个新对象!
}

public static void main(String[] args) {
StringBuffer buff = new StringBuffer();
buff.append("Hello"); //这里 buff.toString()为"hello"
doSomething(buff); 这里copy一个buff的引用传给doSomething()的引数buff1,
//上面方法回来之后buff还是指向原来的地址,而不是在方法内部重新指向的那对象
System.out.println(buff); //所以内容没改变
}
}
[/Quote]
AwL_1124 2008-04-26
  • 打赏
  • 举报
回复
main()方法中的buff是一个局部变量
而上边的那个方法中的是令外一个局部变量··
Leo1734 2008-04-26
  • 打赏
  • 举报
回复
建议将方法参数传递和返回值的问题先搞清楚。
myair2006 2008-04-26
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 caoyinghui1986 的回复:]
public class Test {
public static StringBuffer doSomething(StringBuffer buff) {
//2 看这里你又重新生成了一个StringBuffer.
buff = new StringBuffer();

buff.append("Hello World");
return buff;
}

public static void main(String[] args) {
StringBuffer buff = new StringBuffer();

[/Quote]
yes 同意
keke_bear 2008-04-26
  • 打赏
  • 举报
回复
支持5楼
kangken 2008-04-26
  • 打赏
  • 举报
回复
很明显 buf的值还是dosomething函数返回的值
灿烂星河 2008-04-26
  • 打赏
  • 举报
回复
[Quote=引用 43 楼 JadoNet 的回复:]
main方法中的doSomething(buff);
没有做任何改变buff的工作,所以有与没有一个样。
[/Quote]
楼上正解
JadoNet 2008-04-25
  • 打赏
  • 举报
回复
main方法中的doSomething(buff);
没有做任何改变buff的工作,所以有与没有一个样。
king_spf 2008-04-25
  • 打赏
  • 举报
回复
你在doSomething这个方法里面重新创建了一个对象并把方法体内的buff引用指向了新创建的那个对象!
所以doSomething这个方法实际上并没有改变原来那个对象的值
wrong1111 2008-04-25
  • 打赏
  • 举报
回复
[Quote=引用 22 楼 gujing01 的回复:]
LZ的问题是在于,虽然在函数doSomething内部改变了参数所引用的对象,但是,函数调用时候的传入的参数和函数内部的参数是两个指向相同实例的引用。实际上就是......栈上变量(这个变量是个“指针”)的值传递到函数里。你改变被复制过来的栈变量,主函数里的栈变量又不会改变引用。
[/Quote] 发错了,是22楼的!

5 楼 8楼正解!
wrong1111 2008-04-25
  • 打赏
  • 举报
回复
[Quote=引用 23 楼 findself 的回复:]
引用楼主 xuwenhao2002 的帖子:
public class Test {
public static StringBuffer doSomething(StringBuffer buff) { //2,
buff = new StringBuffer();    //3,doSomething方法的buff引用指向另一新建的StringBuffer对象
buff.append("Hello World");   //4,向这一新对象发送append("Hello World")消息
return buff;                  //5,返回此对象
}

public static void main(String[] args) {
StringBuffer buff =…
[/Quote]
23 楼的怎么看都像在说绕口令呀!^-^
yingjie110 2008-04-25
  • 打赏
  • 举报
回复
补补你java基础吧。。水平啊 。。。
加载更多回复(38)

62,615

社区成员

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

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