package test;public class Test { /**
* @param args
*/
public static void main(String[] args) {
StringBuffer a = new StringBuffer("A");
StringBuffer b = new StringBuffer("B");
change(a,b);
System.out.println(a+":"+b); }
static void change(StringBuffer x, StringBuffer y){
x.append(y);
y = new StringBuffer("aaaaa");
}}
上面代码会输出什么结果?为什么?高手请详细解释一下!
* @param args
*/
public static void main(String[] args) {
StringBuffer a = new StringBuffer("A");
StringBuffer b = new StringBuffer("B");
change(a,b);
System.out.println(a+":"+b); }
static void change(StringBuffer x, StringBuffer y){
x.append(y);
y = new StringBuffer("aaaaa");
}}
上面代码会输出什么结果?为什么?高手请详细解释一下!
因为调用了x的方法,x中的状态变了
没有调用y中的方法,仅仅对局部变量y重新赋值,原y没有变化。
这个真的改变了x指向的内容y = new StringBuffer("aaaaa");
这个不会改变原始的对象。
java方法参数传值,不传指针
StringBuffer是个类类型的,传的是指针,所以形参x改变,原来的a也改变了(因为传的是指针),但是你又让形参y重新指向了一个新的对象(y = new StringBuffer("aaaaa");),所以y的值是字符串"aaaaa",但原有的实参b并不会发生变化,还是字符串"B",所以输出的是AB:B
-------
因为:传递StringBuffer的时候,change函数的参数是引用传递,实际上传递的是这个对象的内存地址。
在change函数中,对x参数进行了append操作,但是指针地址还是指向参数a的地址,所以x变化后a的值也变了。
而在change函数,对y进行了new一次,java中每次new的时候就会申请一块新的内存地址,当我们对y进行重新new的时候,y所指向的内存地址已经指向了另一块内存地址,对y的任何操作都不会影响到b的值,因为两个对象的地址已经不一样了,所以b的值不会改变。