Java参数传递是pass-by-value的, modify()方法传入的r1, r2 均为复制句柄, 分别指向sb1, sb2.
但是 r1 = null; 令r1重新初始化, 此时r1与sb1指向已经不同, 因此sb1 未被修改
而r2与sb2的指向始终一致, 都是 "pears" 那个StringBuffer对象, 因此修改r2同时令sb2也被修改成为 "pears taste good".
但是 r1 = null; 令r1重新初始化, 此时r1与sb1指向已经不同, 因此sb1 未被修改
而r2与sb2的指向始终一致, 都是 "pears" 那个StringBuffer对象, 因此修改r2同时令sb2也被修改成为 "pears taste good".
对于原始类型,例如int,double等都是值传递,而对于类来说,例如StringBuffer,一般都是地址传递。但要注意String这个类,因为JVM对String的内存分配策略不同,所以String类也是值传递。
这里有一篇不错的文章http://www.csdn.net/Develop/article/22%5C22025.shtm,讲的很清楚。
我又看过几个例子,感觉你说的比较正确,我原来的理解的确有误区。谢谢你对我错误理解的纠正。thank you!