public static void main(String[] args) {
StringBuffer a = new StringBuffer("A");
StringBuffer b = new StringBuffer("B");
Operator(a,b);
System.out.println(a+" "+b);
}
public static void Operator(StringBuffer x,StringBuffer y){
x.append(y);
y=x;
}
StringBuffer a = new StringBuffer("A");
StringBuffer b = new StringBuffer("B");
Operator(a,b);
System.out.println(a+" "+b);
}
public static void Operator(StringBuffer x,StringBuffer y){
x.append(y);
y=x;
}
输出AB B
原因:(建议自己动手画图有利于理解)
1》StringBuffer a = new StringBuffer("A");StringBuffer b = new StringBuffer("B");执行到这两句,jvm在栈里面分配了两块内存给引用a,b.在堆里面分配了两块内存给A,B,这里假设AB在堆里面的地址分别是#1,#2,,显然栈里面分配的两块内存里面存放的就是地址#1,#2
2》 Operator(a,b);执行到这儿,转到 public static void Operator(StringBuffer x,StringBuffer y){
x.append(y);
y=x;
}
x.append(y);
y=x;
}
此时jvm会在栈里面再分配两块内存给引用形参x,y.假设存放的分别是地址#3,#4,接下来进行引用传递,将a,b传递给x,y。此时xy里面存放的分别是a,b存放的地址#1,#2, 执行到x.append(y);时,#1地址中原本的A变为了AB,执行到 y=x时,y中存放的地址变为了x中存放的地址#1,
此时,调用函数代码执行完毕,局部变量空间释放,也是释放xy
这个时候,ab中存放的地址还是#1,#2,只是地址#1中存放不再是A,而是AB.#2中存放的依然是B