public class Test{public static void main(String[] args){StringBuffer a = new StringBuffer("One");StringBuffer b = new StringBuffer("Two");Test.swap(a,b);System.out.println("a is " + a +"\nb is " + b);}static void swap(StringBuffer a,StringBuffer b){a.append(" more");b = a;}}为什么b没有改变,仍然输出“b is Two”?
參考答案:a 如何解释 呢 为何a会改变? ,
这个不是全局变量的问题 , 你要知道a 改变了 为何b不改变
为何说明清楚问题 暂时 改为
swap(StringBuffer a1,StringBuffer b1){
a1.append(" more");
b1 = a1;
}
这里有一个 指向的关系。
1.原本 "a1 指向 a ";"b1 指向 b" 这点很容易看出来 按地址(引用)传递
2.但是你用了这句 "b1 = a1;" 把原本 "b1 指向 b" 换成了 "b1 指向 a1" ;
这个时候 你传进来的 b 就脱离了swap的范围了
3.这个StringBuffer 对象是按引用传递。
只要你打印 swap()内的 b1 就知道 b1 也是 "One more"
它已经指向了 a1 了
如果你将代码改成这样你就会很清楚 为何 你的 b 不会改变
public class Test
{
public static void main(String[] args)
{
StringBuffer a = new StringBuffer("One");
StringBuffer b = new StringBuffer("Two");
System.out.println ("begin a is :" + a);
System.out.println ("begin b is :" + b);
System.out.println ("swap start");
Test.swap(a,b);
System.out.println ("swap end\n");
System.out.println("now a is " + a +"\nnow b is " + b);
}
static void swap(StringBuffer a1, StringBuffer b1)
{
System.out.println ("a1 = " + a1);
System.out.println ("b1 = " + b1);
System.out.println ("append( \" more\")");
a1.append(" more");
System.out.println ("a1 = " + a1);
b1 = a1;
b1.append(" more");
System.out.println ("b1 = " + b1);
}
}