长隆动物园熊猫名字:一个关于StringBuffer类的Java题

来源:百度文库 编辑:杭州交通信息网 时间:2024/04/28 02:29:46
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);
}
}

StringBuffer b = new StringBuffer("Two");

b没有改变,当然输入还是Two了。
你应该问的是b在swap中已经改变了,为什么还输出Two吧。

因为b不是全局变量,上面的b和下面的b是不同的,下面的b改变了,不影响上面b的值。