两道scjp题的比较,谁能说出有力的证据说明为什么执行不一样?

yanloveyan2004 2005-10-26 11:54:52
public class Test{
public static void main(String[] args){
StringBuffer a=new StringBuffer("A");
StringBuffer b=new StringBuffer("B");
operate(a,b);
System.out.pintln(a+","+b);
}
public static void operate(StringBuffer x, StringBuffer y){
x.append(y);
y=x;
}
}

public class Test{
public static void stringReplace(String text){
text=text.replace('j','l');
}
public static void bufferReplace(StringBuffer text){
text=text.append("c");
}
public static void main(String args[]){
String textString=new String("java");
StringBuffer textBuffer=new StringBuffer("java");
StringReplace(textString);
bufferReplace(textBuffer);
System.out.println(textString+textBuffer);
}
}
...全文
68 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
inexplicable 2005-10-26
  • 打赏
  • 举报
回复
同意一楼的,补充一点,JAVA虽然object paramter 是 pass by reference
但reference 本身会被copy, 所以像 y = x; 这样的操作不会真正作用在
b对象上的。
yanxiazhiqiu 2005-10-26
  • 打赏
  • 举报
回复
up

你可以看看String和StringBuffer的源码,String的很多方法最后一句是return new String(...),而StringBuffer的很多方法最后一句则是return this;

clear?

好多这种问题哦,thinking in java 在最后的附录里不是有专门讲他们的区别么?
ChDw 2005-10-26
  • 打赏
  • 举报
回复
1. ab,b
2. java,javac


public static void operate(StringBuffer x, StringBuffer y){
x.append(y); //这个已经修改了x的值,所以外部的变量也会影响
y=x; //这个只是修改了y的指向,原来y所指向的旧对象的值没有发生改变,不影响外面
}

public static void stringReplace(String text){
text=text.replace('j','l'); //这个只是修改了text指向,原来所指向旧对象值没有发生改变,不影响外面
}
public static void bufferReplace(StringBuffer text){
text=text.append("c"); //这个已经修改了text值,所以外部的变量也会影响

}


你要注意一点就是了,StringBuffer的Append方法会影响这个对象本身并且把自己作为返回值

String的replace等方法是不会影响自己本身,而是生成一个新的String对象作为返回值

62,615

社区成员

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

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