先看一個簡單的例子:
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 閱讀(1484)
評論(2) 編輯 收藏 所屬分類:
Java基礎