这个是原程序:
public class ForPractise {
    public static void main(String[] args) {
        StringBuffer sb = new StringBuffer("Hello ");        System.out.println("Before change, sb = " + sb);        changeData(sb);     //将SB传入 
        System.out.println("After changeData(n), sb = " + sb);    }           public static void changeData(StringBuffer strBuf) {  //传递引用           StringBuffer sb2 = new StringBuffer("Hi ");    //建立另一个StringBuffer对象sb2           strBuf = sb2;                                   //将sb2的引用地址(既指针)传给直接strBuf str未建立副本
           
           sb2.append("World!");                           //修改sb2的值    }}
输出的结果是:
Before change, sb = Hello 
After changeData(n), sb = Hello 请高手解答下   调用changeData以后  为什么没有改变 sb的值呢?     如果我把changeData里的语句改为strBuf.append("world");   则会输出
Before change, sb = Hello 
After changeData(n), sb = Hello world
这是为什么呢?   为什么传引用在这里不起作用了呢?

解决方案 »

  1.   

    public static void changeData(StringBuffer &strBuf)
      

  2.   

    当然不会起作用了把你的      public static void changeData(StringBuffer strBuf) {  //传递引用           StringBuffer sb2 = new StringBuffer("Hi ");    //建立另一个StringBuffer对象sb2           strBuf = sb2;                                  //将sb2的引用地址(既指针)传给直接strBuf str未建立副本 
              
              sb2.append("World!");                          //修改sb2的值     } 改为:      public static void changeData(StringBuffer strBuf) {  //传递引用 
     
              strBuf .append("World!");                          //修改sb2的值     } 
      

  3.   

    这个是java的传值调用,你传递的是sb,stringBuffer的地址,你把地址传给了局部变量
    局部变量把地址又换了个新的地址,原先的sb地址依然没有改变呀.
      

  4.   

    记住:
    java只有值传递(对引用类型传的是地址的值)
    public static void changeData(StringBuffer strBuf)
    中,strBuf是局部变量,函数执行完毕,strBuf消失(在changeData执行的时候,开始sb与strBuf的值是
    一样的,所以指向同一个对象,但在后来strBuf就重新赋值了,sb还是原来的)
    所以对sb根本就没有什么影响
      

  5.   

    sb-->Hello
    strBuf-->Hello
    sb2--Hi   
    然后执行这句话结束时strBuf = sb2;
    strBuf-->Hi
    执行这句话结束时sb2.append("World!");
    sb2-->HiWorld!, strBuf-->HiWorld!, sb-->Hello
      

  6.   

    可是为什么我把changDate里的语句sb2.append("world");改成strBuf.append("world");之后,
    运行结果还是: Before change, sb = Hello 
                 After changeData(n), sb = Hello 
    这是怎么回事呢?
      

  7.   

    理解:
        public static void main(String[] args) { 
            StringBuffer sb = new StringBuffer("Hello "); //假设此时sb中存储的是一个地址值,假设为1234,        System.out.println("Before change, sb = " + sb);         changeData(sb);    //将SB传入 执行这个之后strBuf也存储了一个地址值1234,也就是说有了两存储地址值1234的地方,他们分别为sb和strBuf
            System.out.println("After changeData(n), sb = " + sb);     }       public static void changeData(StringBuffer strBuf) {  //传递引用           StringBuffer sb2 = new StringBuffer("Hi ");    //建立另一个StringBuffer对象sb2假设此时sb2有地址值4321           strBuf = sb2;                                  //将sb2的引用地址(既指针)传给直接strBuf str未建立副本 使得strBuf也有了地址值4321,这是此程序的错误地方,这时候sb值是1234,而sb2和strBuf的值是4321。从此开始你对strBuf进行任何操作都和sb没有关系了。
              
              sb2.append("World!");                          //修改sb2的值     } }