日期:2014-05-20  浏览次数:20773 次

小弟对下面程序的输出结果实在想不明白,请大家多多指教
public   class   Test   {
    public   static   void   main(String[]   args)   {
StringBuffer   a=new   StringBuffer   ( "A ");
StringBuffer   b=new   StringBuffer   ( "B ");
oper(a,b);
System.out.print(a+ ", "+b);
}
    static   void   oper(StringBuffer   c,StringBuffer   d){
    c.append( "B ");
    d=c;
    }
}
此小程序的输出结果是;AB,B;但是我实在想不明白.我认为应该为:AB,AB;为什么用append赋值的结果与直接赋值的结果不一样那?

------解决方案--------------------
可以通过参数的引用对对象进行操作,但是不可以改变参数引用的值
相当于参数是两个人,进入方法的时候两个人都是闭着眼的,但是你可以针对这两个人做 "睁眼 "操作,那么人出去的时候眼是睁开的,但是不能把人都给换掉了,进来的是张三李四,出去的还是张三李四
------解决方案--------------------
debug
------解决方案--------------------
问题在引用类型参数的传递上
在你的程序中当把b引用传递给d引用时,只不过是在oper方法内部又新建了一个StringBuffer类型的引用d,并且d指向内存中的“B”对象,在程序一开始的时候b引用就指向了“B”对象,所以在执行oper函数的时候有两个引用指向“B”对象,oper中执行d=c时将引用d指向了“AB”对象
而b引用仍然指向“B”对象,所以输出结果为AB,B
------解决方案--------------------
到你的开发环境中,设置断点,调试一下,看看你的变量的值的变化