一道基本题,有点疑问

ayds1984 2009-08-14 09:45:39
public static void main(String[] args) {
String textString = new String("java");
StringBuffer bufferString = new StringBuffer("java");
stringReplace(textString);
StringBufferReplace(bufferString);
System.out.println(textString+bufferString);
}
private static void stringReplace(String textString){
textString = textString.replace("j", "i");
}
private static void StringBufferReplace(StringBuffer bufferString){
bufferString = bufferString.append("C");
}


答案为什么是javajavaC而不是javajava呢
...全文
51 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
liu78778 2009-08-24
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 ayds1984 的回复:]
我明白了,其实bufferString = bufferString.append("C");
和bufferString.append("C");

效果一样哈哈,结贴了,没想过来哈哈
[/Quote]
你就算只写bufferString.append("C");它也是javajavaC
zhuzhusany 2009-08-14
  • 打赏
  • 举报
回复
首先这两个方法都是传递对象引用
private static void stringReplace(String textString){
textString = textString.replace("j", "i");
}

这个方法会让textString指向一个新的对象,而不是改变它的指向对象的状态(因为String是不可变的所以不能修改它的内部状态),这种通过对象引用作为方法参数指向新对象在JAVA中是不允许的,所以有很多大师都把此视之为JAVA只有值传递

private static void StringBufferReplace(StringBuffer bufferString){
bufferString = bufferString.append("C");
}
而这个方法的参数是StringBuffer的引用,可见方法内将这个引用指向的对象的状态进行了操作,即将它的值添加了C这个字符串,那么这个字符串的内容就变成了javaC了,可见将引用赋值给新对象是不可行的,但是改变对象的属性是可以的。

bigbug9002 2009-08-14
  • 打赏
  • 举报
回复
stringReplace:,参数相当于一个局部变量,其作用域和生命期就是stringReplace方法内部,所以局部变量实际上是被隔离的,方法体就是一个隔离区,与方法以外的同名变量是两个不同的个体,互不影响。所以对参数的修改不会影响到方法以外和参数同名的变量。如例子中的方法参数textString,在方法中对做了修改,但这个参数在方法结束后,被释放了。对外部没有任何影响。

stringBufferReplace:与上面不同,这个方法中并没有对参数做修改,而是对参数这个引用所指向的内容做了修改。被修改的内容是由两个引用指向的,一个是实际参数(main中的bufferString),一个是形式参数(stringBufferReplace方法的参数bufferString),用其中的一个引用对内容所修改,必然所影响到另一个。
好吃的松子 2009-08-14
  • 打赏
  • 举报
回复
String中修改字符串的方法都是产生新的对象,这跟String的实现有关

StringBuffer.append方法是在当前对象后追加

ayds1984 2009-08-14
  • 打赏
  • 举报
回复
我明白了,其实bufferString = bufferString.append("C");
和bufferString.append("C");

效果一样哈哈,结贴了,没想过来哈哈
MinThinking 2009-08-14
  • 打赏
  • 举报
回复
String不可变,stringReplace方法只是重新创建了另一个String对象,你原来的不变。
StringBuffer可变,所以可以在原来的基础上修改。
吴冬冬 2009-08-14
  • 打赏
  • 举报
回复
String是不可变字符串
StringBuffer是可变字符串

62,614

社区成员

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

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