有这么一个程序片段
public class Test{
public static void main(String[] args){
StringBuffer a = new StringBuffer("A");
StringBuffer b = new StringBuffer("B");
operate(a,b);
System.out.println(a+","+b);
}
public static void operate(StringBuffer x,StringBuffer y){
x.append(y);
y=x;
}
}
问执行结果。
初看此题目时,是这么想的,operate函数中将x,append了y则x应该为AB,x所指向的对象和a指向的对象是一个所以a也为AB,然后又看到y=x,认为将y指向了x,则y也为AB,就主观的认为了b也为AB。一看答案发现y为B,遂想了一下,发现地确实我弄错了。
operate函数中y=x,这里的y和x都是在形参表中定义的,是一个新对象,众所周知java对象所有的函数传递都是值传递,所以这里的x,y并不是main函数中的a,b对象,而是两个新对象,但是他们都指向的是相同的堆内存中的对象,所以operate中的第一句x.append(y),也影响到了a的值,而y=x,则只改变了operate函数中的值,所以b对象还是B。
粗略的内存指向如图所示: