public class Test {
public static void main(String[] args){
StringBuffer a = new StringBuffer("A");
StringBuffer b = new StringBuffer("B");
operater(a,b);
System.out.println(a+","+b);
}
public static void operater(StringBuffer x, StringBuffer y){
x.append(y);
y = x;
}
}答案是"AB,B"!请问下为什么变量a的值改变了,而变量b却不会改变?若想让b的
值也改变,原程序该怎么改?
public static void main(String[] args){
StringBuffer a = new StringBuffer("A");
StringBuffer b = new StringBuffer("B");
operater(a,b);
System.out.println(a+","+b);
}
public static void operater(StringBuffer x, StringBuffer y){
x.append(y);
y = x;
}
}答案是"AB,B"!请问下为什么变量a的值改变了,而变量b却不会改变?若想让b的
值也改变,原程序该怎么改?
你在其中改变了y的指针,可是主函数里的b的指针没有跟着变啊
当然还是B了
StringBuffer是个类,所以a是个对象,传递的是引用。把operater(StringBuffer x, StringBuffer y)改为operater(final StringBuffer x, StringBuffer y)就不能运行啦。
但既然来了,还是说点,能改变引用所指的内容,但不能改变引用本身。另外要注意String的赋值,如String a = "a";String b = a;不要认为只有一个对象,其实产生了两个对象,java的String在赋值时复制内容,其他的对象赋值是传播引用。
reference x指向reference a
reference y指向reference by=x 后
reference y指向reference a
但reference a 并没有指向 reference b所以你方法里做的动作对打印没有起到作用
public static void main(String[] args){
StringBuffer a = new StringBuffer("A");
StringBuffer b = new StringBuffer("B");
operater(a,b);
System.out.println(a+","+b);
}
public static void operater(StringBuffer x, StringBuffer y){
x.append(y);
// 关键是这里,改变的是指针指向的内容
y.delete(0, y.length());
y.append( x );
}
}
这个在Stringbuffer中是没有效果的
http://community.csdn.net/Expert/topic/4236/4236928.xml?temp=.9343988首先你要弄明白,函数里对参数的操作,实际上是对参数的拷贝操作,也就是编译器会自动创建一个引用,指向和参数(也就是函数外的对象)相同的一块内存地址,在函数里操作的参数对象,实际上是这个被创建出来的引用,调用x.append(y);修改了x引用的内存信息,而x和函数外的a引用指向相同的地址,所以a也变了,而调用y = x;改变了函数里被创建出来的参数拷贝的引用的指向,也就是y指向了新的内存地址,但函数外的b并没有指向新的内存地址,b还是引用原来的内存信息,所以函数外的b没有改变。