public class TestStringBuffer {
public static void main(String[] args) {
StringBuffer a=new StringBuffer("A");
StringBuffer b=new StringBuffer("B");
method(a,b);
System.out.println(a+","+b);
}
public static void method(StringBuffer x,StringBuffer y){
x.append(y);
y=x;
}
} 谁解释一下答案为什么不是A,B或AB,AB?
AB,B
原因:a,b,x,y只是对象的reference(句柄)
a指向一个对象,b指向另外一个
形参x=a后x操作的就是a指向的对象
所以x.append操作的就是实际a指向的对象
但是y=x只是相当于把y现在也是指向a指向的对象而已
同时,它已经不再指向b指的对象
但是它什么都没有做,所以b未变
兄弟,我把你的程序做下修改,你自己揣摩下吧public class TestStringBuffer {
public static void main(String[] args) {
StringBuffer a=new StringBuffer("A");
StringBuffer b=new StringBuffer("B");
method(a,b);
System.out.println(a+","+b); //打印出来 AB,B
}
public static void method(StringBuffer x,StringBuffer y){
x.append(y);
y=x;
System.out.println(x+","+y); //打印出来是 AB,AB
}
} 原因是 a,b,x,y 都是引用类型,换言之它们都是变量,它们的内容是它们指向对象的地址,在子函数中
y=x
你仅仅对y的内容做了改动,但是b的内容并没有改动,所以 会出现这样的结果。希望我讲清楚了,欢迎讨论。
意思是在函数体中无法改变实参与变量的对应关系
public static void main(String[] args) {
StringBuffer a=new StringBuffer("A");
StringBuffer b=new StringBuffer("B");
method(a,b);
System.out.println(a+","+b);
}
public static void method(StringBuffer x,StringBuffer y){
//x.append(y);
//y=x;
x.append("B");
y.append("A");
//y = x.append("A" + "B");
}
}值得揣摩
public static void main(String[] args) {
StringBuffer a=new StringBuffer("A");
StringBuffer b=new StringBuffer("B");
StringBuffer c[];
c=method(a,b);
a=c[0];
b=c[1];
System.out.println(a+","+b); // RESULT:AB,AB
}
public static StringBuffer[] method(StringBuffer x,StringBuffer y){
StringBuffer[] sb=new StringBuffer[2];//sb纯粹是StringBuffer的头字母缩写,呵呵
x.append(y);
y=x;
sb[0]=x;
sb[1]=y;
return sb;
}
}
b,y也指向同一个StringBuffer在method方法中 x.append(y) 改变了x所指向StringBuffer的内容,
当然也就等于同时改变了a所指向StringBuffer的内容而y=x 只是改变了y的指向,b所指向的对象并没有改变
对于抽象类型则复制一份引用传递
这里y传进来只是引用,你改变了引用,没有用,你只是把引用y付了一个新的引用。并没有影响到引用b。b还是指向原来的引用。但是x则不通,你调用了x引用,对原对象进行了操作,改变了x和a指向的对象的内容。你还是工力不够啊。把指针和对象没有分开!
(1) |A | |B |
~~~~ ~~~~
/ | / |
a | b |
| |
x y
__ __
(2) |AB| |B |
~~~~ ~~~~
/ | / |
a | b |
| |
x.append(y) y
__ __
(3) |AB| |B |
~~~~ ~~~~
/ | \ /
a | \ b
| \
x \------->y=x
(4) a is "AB", b is "B"
你這樣很辛苦哦