一、例题引入
1、考虑下列代码段
StringBuffer WZN = new StringBuffer("test ");
System.out.println("WZN is"+ WZN.toString());
Change(WZN);
System.out.println("WZN is"+ WZN.toString());
// 其中Change函数如下:
public static void Change(StringBuffer str){
str.append("1");
}
在运行后得到下列结果:
WZN is test
WZN is test 1
由于 WZN 所指向的对象的值有所变化,我们猜想可能是因为对象作为参数传递时,传递的是该对象的引用。但下面的例题确推翻了刚才的猜想:
2、考虑下列代码段:
// 这次仅Change函数有所改变:
public static void Change(StringBuffer str){
str = new StringBuffer("example ");
str.append("2");
}
// 其余部分不变:
StringBuffer WZN = new StringBuffer("test ");
System.out.println("WZN is"+ WZN.toString());
Change(WZN);
System.out.println("WZN is"+ WZN.toString());
运行结果如下:
WZN is test
WZN is test
这次 WZN 并没有变为“example 2”。
二、结果分析
在执行 StringBuffer WZN = new StringBuffer("test ") 语句时,我们创建了一个指向新建对象的引用。例 1 中的 str 也指向了 WZN 所指向的对象,因此结果发生了改变。但在例 2 中,str 相当于一个新建的对象,原来的 WZN 的值并未发生改变。在 Java 中,对象作为参数传递时,传递的是一份“引用的拷贝”。