结果: AB,Ba指向new StringBuffer("A"), b指向new StringBuffer("B").
在方法operate(a, b)中, 将a所指向那个StringBuffer变成"AB", 并且让一个本地变量y也指向这个StringBuffer, 在方法体以外, b指向的对象没有被改变, 仍然是new StringBuffer("B").

解决方案 »

  1.   

    x.append(y)为何会影响到a的值,而y=x不会影响到b的值?在方法operate中x,y都是新的局部变量吧?
      

  2.   

    public class ReplaceTest {
        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,第一次查)。
      

  3.   

    Java总是传值调用。对象引用时通过值来传递的。
    方法不能修改基本类型的参数。
    方法可以修改对象参数的状态。(x.append(y)属于这种情况)
    方法不能让对象参数指向新的对象。(y = x属于这种情况)
      

  4.   

    这点 java 和 c 有区别
    不能单纯的用形参和实参来解释java 中所有的传递都是值的传递.
    a, b的值其实是地址指针
    operate (a,b) 是将a, b所指的地址传递进函数.
    x.append(y) 将 a 指向的地址 改成了新的 "x+y"的对象的地址.指向的地址改变了,那么函数外a的值当然也会变. 就象 a原来指着 301 室, 现在被改去 302了, 那么内容当然变了.而 y = x; 只是改变了地址本身, 而没有影响 b 指针的指向的值. 
    就想门牌换了,但是房间还是原来那间.
      

  5.   

    String buffers are safe for use by multiple threads. The methods are synchronized where necessary so that all the operations on any particular instance behave as if they occur in some serial order that is consistent with the order of the method calls made by each of the individual threads involved. 
    ....
    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. 这两段没大明白
      

  6.   

    结果是:AB,Ba指向“A”,b指向“B",调用函数后,x也指向”A"(与a指向同一块地址),y指向“B",x.append(y)后x与a的指向地址的内容变为”AB“,y=x后,y也指向”AB“,随着operate函数的推出,x,y这两个临时引用型变量消失,则a指向的内容为”AB“而y指向的内容仍然为"B"
      

  7.   

    结果是:AB,B也解释一下:首先JAVA里没有指针的概念,所以尽量不要往那方面想。
    只要记住基本类型是值传递,引用类型是引用传递。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都指向同一个对象了。
      

  8.   

    一开始y指向b,后来y又指向x,所以b的地址值根本没变,不知道确buqueqie
      

  9.   

    main: a-->“A”,b-->"B"
    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"