日期:2014-05-20  浏览次数:20698 次

问一JAVA基础题,主调函数传递引用地址给被调函数,为什么变量值没有被改变??
问一JAVA基础题,下面程序打出来结果是:AB,B  
main调用operate(a,b)时,是对象引用的传递,传递a、b的地址给operate,在y=x的操作时,应该能改变b的值,为什么变量b的值没有发生改变呢?偶看不明白,请大家指点一下吧:)

public   class   T{
public   static   void   main(String[]   arg){
StringBuffer   a   =   new   StringBuffer   ( "A ");
StringBuffer   b   =   new   StringBuffer   ( "B ");
operate   (a,b);
System.out.println(a   +   ", "   +b);
}
static   void   operate   (StringBuffer   x,   StringBuffer   y)     {
x.append   (y);
y   =   x;
}
}  


------解决方案--------------------
a b 是2个指针 是实参
x y 也是2个指针 是形参

a b 和 x y之间的传递是值传递
因此,形参y=x这句话,并不能影响到b,因此b仍然指向对象“B”

但x.append (y);不一样,由于a和x指向同一个对象,因此利用x对该对象的改变,同样可以通过a来体验到,因此【a所指向的对象】变成了“AB”

指针 指针指向的对象 不一样啊!!!一定要搞清楚
------解决方案--------------------
开始
a指向地址0001,0001存着值A
b指向地址0002,0002存着值B
调用operate()后
x指向地址0001,0001存着值A
y指向地址0002,0002存着值B
x.append(y);
将x所指向的地址的内容改变为AB,这个时候x依然指向0001,但是0001中保存的值变为了AB
y=x;
再将y指向的地址变的和x所指向的地址相同,这个时候y指向地址0001,y引用AB
而b并没有改变引用地址,他依然指向0002地址,并且0002地址的值也没有改变

最终结果
a=AB
b=B
x=AB
Y=AB
------解决方案--------------------
这里只是y指向了x
并不是a指向了x
想要a变成AB
至少要让a指向y