前几天又看到这个面试题,再次看看java
public
class
Jtest{
public
static
void
main(String[] args) {
StringBuffer a=
new
StringBuffer (
"A"
);
StringBuffer b=
new
StringBuffer (
"B"
);
oper(a,b);
System.out.print(a+
","
+b);
}
static
void
oper(StringBuffer c,StringBuffer d){
c.append(
"B"
);
d=c;
}
}
------输出结果是什么?面试
此题关键就在于 oper(c,d) 方法,这个方法到底作了什么,怎么结果就和想的不同呢?
那么,就来看一下这个方法作了什么。
app
上代码:spa
package test; public class Jtest{ public static void main(String[] args) { StringBuffer a=new StringBuffer ("A"); StringBuffer b=new StringBuffer ("B"); //取代 oper(a,b) start; StringBuffer c; StringBuffer d; c = a; //c的地址指向了a,此时 c 的值为"A"; d = b; //d的地址指向了b,此时 d 的值为"A"; c.append("B"); //在c(a)的地址值变为 “AB” d=c; // d的地址指向了c,也就是指向了a,**关键就在这里了**,那么能够看到,这个过程当中根本就没对b作任何操做, //就好像gg(d)路过一mm(b),说:这mm(b)不错,而后发现前面有个更有吸引力的mm(c)而后就见异思迁了,而后拿了一朵花("B")给mm(c(a))了,,因此mm(b)压根就不知道什么状况,没参与 // so, b 仍是b("B") , a已不是a("A"),二是a("AB") //取代 oper(a,b) end; System.out.print(a+","+b); } static void oper(StringBuffer c,StringBuffer d){ c.append("B"); d=c; //一开始的想法是这样的,c = a; d= b; 那么 c.append("B");后 c=“AB”,d=c = "AB",实际上并非数学中的简单等价传递 } }