随笔 - 37  文章 - 29  trackbacks - 0


常用链接

留言簿(3)

随笔分类

随笔档案

最新评论

阅读排行榜

评论排行榜


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

FeedBack:
# re: String StringBuffer 2008-11-04 15:25 sclsch
2.java中只有值传递

不是吧,java对于基本类型是传递的是值的copy,
对于对象类型传递的是引用的copy.
public static void operate(StringBuffer x, StringBuffer y) {
x.append(y);
y = x;
}
虽然y指向对象ab,但buffB 仍然指向了b  回复  更多评论
  
# re: String StringBuffer 2008-11-27 16:27 EvanLiu
是的,对象类型传递的是引用的copy,但这个copy就是一个value
a Java application passes object references by value  回复  更多评论
  

只有注册用户登录后才能发表评论。


网站导航: