结果: AB,Ba指向new StringBuffer("A"), b指向new StringBuffer("B").
在方法operate(a, b)中, 将a所指向那个StringBuffer变成"AB", 并且让一个本地变量y也指向这个StringBuffer, 在方法体以外, b指向的对象没有被改变, 仍然是new StringBuffer("B").
在方法operate(a, b)中, 将a所指向那个StringBuffer变成"AB", 并且让一个本地变量y也指向这个StringBuffer, 在方法体以外, b指向的对象没有被改变, 仍然是new StringBuffer("B").
public static void stringReplace (String text) {
text = text.replace ('j' , 'i');
}
public static void bufferReplace (StringBuffer text) {
text = text.replace (0 ,1, "i");
//text = text.append ("C");
}
public static void main (String args[]) {
String textString = new String ("java");
StringBuffer textBuffer = new StringBuffer ("java");
stringReplace (textString);
bufferReplace (textBuffer);
System.out.println (textString + textBuffer);
}
}
再看这个,好像StringBuffer有些蹊跷,待我去查查api(刚学java,第一次查)。
方法不能修改基本类型的参数。
方法可以修改对象参数的状态。(x.append(y)属于这种情况)
方法不能让对象参数指向新的对象。(y = x属于这种情况)
不能单纯的用形参和实参来解释java 中所有的传递都是值的传递.
a, b的值其实是地址指针
operate (a,b) 是将a, b所指的地址传递进函数.
x.append(y) 将 a 指向的地址 改成了新的 "x+y"的对象的地址.指向的地址改变了,那么函数外a的值当然也会变. 就象 a原来指着 301 室, 现在被改去 302了, 那么内容当然变了.而 y = x; 只是改变了地址本身, 而没有影响 b 指针的指向的值.
就想门牌换了,但是房间还是原来那间.
....
Whenever an operation occurs involving a source sequence (such as appending or inserting from a source sequence) this class synchronizes only on the string buffer performing the operation, not on the source. 这两段没大明白
只要记住基本类型是值传递,引用类型是引用传递。StringBuffer a = new StringBuffer ("A");
StringBuffer b = new StringBuffer ("B");
a变量指向一个新的值A。
b变量指向一个新的值B。operate (a,b);
使得x,y两个变量分别指向a,b的变量的对象.也就是a,b对象里的属性改变,x,y也跟着改变。就是下面的。
x.append(y);
这里x的对象的属性改变了,但是x还是指向的a的对象。因为a和x还都指向一个对象,所以任何一个改变,另外的就跟着变。
所以是AB。y = x;
这里就不一样了。= 就是说明y重新被指向了另一个对象,而不是b了。就相当于
y = new StringBuffer();这样。
所以当y改变时,b的对象并不变化。当这句话完成以后,a,x,y都指向同一个对象了。
operate: 初始化: x=a-->"A" , y=b-->"B" x.append(y); x=a-->"AB"
y=x; x=a=y -->"AB"
系统回收x,y
main: a-->"AB" b-->"B"