先看一个简单的例子:
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 阅读(1516) 
评论(2)  编辑  收藏  所属分类: 
Java基础