把strBuf = new StringBuffer("Hi ");行注释掉和不注释掉将看到两个不同的结果注释的时候: Before change, sb = Hello After changeData(n), sb = Hello World! 不注释掉的时候: Before change, sb = Hello After changeData(n), sb = Hello 当不注释掉的时候并没有出现: Before change, sb = Hello After changeData(n), sb = Hi World!
这说明了,在strBuf = new StringBuffer("Hi ");这行中,strBuf在内存中开辟了一个新的存储地址,不再和开始的sb指向同一个位置,所以,print出来的sb的值没有改变。这个时候的strBuf为"Hi World!"(可以在changeDate方法里面print出来),sb为"Hello"。
就你的例子而言: public class StringTester { public static void changeString(String s,String s2, StringBuffer sb) { //这里有3步:首先生成" by Definition"对象,然后s所指向的对象和" by Definition"拼接生成新的对象,最后s引用指向刚生成的对象.注意,s原来是指向new String("Java")对象的,这里又指向了新生成的对象,那么原来的对象呢?实际上new String("Java")对象仍然被main方法中的本地变量string所指向,这就是为什么你的打印结果还是原来的值! s += " by Definition"; //s2也是同样的道理" s2="good"; //sb就不一样了,调用它的append方法,实际上是对它的char数组直接操作!因为sb和main方法里的buffer指向同一个对象,所以sb的变化会影响到buffer! sb.append(" by Definition"); sb.insert(4,"2");
}
public static void main(String args[]) { //string引用指向new String("Java")对象 String string = new String("Java"); //string2引用指向"good"对象 String string2 = "good"; //buffer引用指向new StringBuffer("Java")对象 StringBuffer buffer = new StringBuffer("Java");
changeString(string,string2, buffer);
System.out.println("String after method call: " + string);
System.out.println("string2----->"+string2);
System.out.println("StringBuffer after method call: " + buffer);
呵呵,你真明白了吗?你那段话是什么意思.我倒很不明白. 以下: String虽是对象,但它是不可变的.既然你想改变string,string2 的值(LZ可不是改变对象的值,改变的是引用的值),那就在方法体内加个return 语句就好了. StringBuffer可变对象,方法体内改变了对象的内容,它也变了. 代码: public class StringTester
{ public static String changeString(String s,String s2, StringBuffer sb)
{ s += " by Definition"; s2="good"; sb.append(" by Definition"); sb.insert(4,"2"); return s; }
public static void main(String args[])
{ String string = new String("Java"); String string2 = "good";
StringBuffer buffer = new StringBuffer("Java");
string=changeString(string,string2, buffer);
System.out.println("String after method call: " + string);
System.out.println("string2----->"+string2);
System.out.println("StringBuffer after method call: " + buffer);
return 将不起任何作用?啥意思啊... 呵呵,我没有说清楚:如果注释掉string2=string=changeString(string,string2, buffer); 打印的结果还是实参string的值java,而不是java by by Definition,其实没啥意思啊。再请教高手:string或者string2都指向了新的对象,那么原先他们所指的对象呢,按照你的说法,string或string2仍然指向原来的酒对象,这样string 就指向两个对象了?如果我重新定义:string="AAAA",是不是又创建了一个新对象,string指向"AAAA",同时又指向"java by Definition",还指向"java" 呢,指向三个对象,似乎很迷惑?