记住:
String是不变对象,而StringBuffer不是
Java中对象都是引用,或者说方法调用中传递的是对象的指针有了上面的规则,程序的结果就不难理解了!
0. 在调用test()方法后,开始时传递进来的s和s2相当于两个指针,分别指向
   main()中的s和s21. 在//3处 s2=s ,所以s2.append("hah") 的结果是修改了main中的s值,因此在main中的//9显示出来s的结果就是goodhah2.在test()中一直没有修改main()中的s2所以s2只不变,始终是"bad"
如果你把StringBuffer改成Date,程序作些相应的修改,你可以很容易理解上面的Java以对象引用方式传递参数的机制!

解决方案 »

  1.   

    如果对C/C++的指针比较熟悉就好理解了。
    语句: s2=s;//3
    说明:s2 指向同样的 s 地址。以后s2内容的改变,将不影响main中的 s2。语句: s=new StringBuffer("new");//4 
    说明:s指向新的地址,s, s2地址不同。语句: s2.append("hah");//8
    说明:改变main中的 s。
      

  2.   

    StringBuffer操作的是句柄(也可以理解成地址吧),无论你在那里改变的值都会影响全部的值===================================
    我的一分耕耘,你能给一分收获
      

  3.   

    这个和变量的作用范围有关,在test中,你将s指向了new的地址空间,s和s2在test中的变化只在test中有效,出了test,就无效了。而你的最后两个输出是在main中的。这时,s就要指向在main中的地址空间。