先看一个简单的例子:
public class Test1 {
public static void operateString(String s) {
s.replace("j", "i");
}
public static void operateStringBuffer(StringBuffer sb) {
sb.append("C");
}
public static void main(String args[]) {
String sa = new String("java");
StringBuffer sba = new StringBuffer("java");
operateString(sa);
operateStringBuffer(sba);
System.out.println(sa);
System.out.println(sba);
}
}
答案很简单:
java
javaC
原则:
1.String是不可变对象:
public final class String extends Object
2.java中只有值传递
replace函数源码中:
public String replace(char oldChar, char newChar) {
...
return new String(0, len, buf);
}
返回的是另一个String对象。
而在上面的operateString方法中,是无返回值的,新产生的String对象被丢弃了,而sa仍然指向最初的那个String对象。
第二个例子:
public class Test2 {
public static void operate(StringBuffer x, StringBuffer y) {
x.append(y);
y = x;
}
public static void main(String args[]) {
StringBuffer buffA = new StringBuffer("a");
StringBuffer buffB = new StringBuffer("b");
operate(buffA, buffB);
System.out.println(buffA + "," + buffB);
}
}
答案是:
ab,b
开始时a、x指向同一个StringBuffer对象(这里称它为对象1),它的值是"a";
b、y指向同一个StringBuffer对象,它的值是"b"。
执行x.append(y)时,对象1的值被改变,变为"ab";
而执行y=x时,变量y指向被改变,指向了和x同一个StringBuffer对象。但是变量b的指向还是没有改变,所以仍然为"b"
posted on 2008-04-08 20:59
EvanLiu 阅读(1460)
评论(2) 编辑 收藏 所属分类:
Java基础