public static void operator(StringBuffer x,StringBuffer y){
x.append(y);
y = x; }
public static void main(String[] args) {
StringBuffer a = new StringBuffer("A");
StringBuffer b = new StringBuffer("B");
operator(a,b);
System.out.println(a + "," + b);//结构是 AB,A为什么不是AB,AB
}
// 对于值传递,引用传递,作用域 的理解我是这样的 大家帮我分析下 基本数据类型是值传递, 引用,数组等是值传递,作用域只要注意在调用的方法就行的域就行
// 但这题为什么不是AB,AB呢 帮我总结下这三个谢谢
从main后第一句开始。
StringBuffer a = new StringBuffer("A");
StringBuffer b = new StringBuffer("B");
栈内存分出两个区域a和b,分别指向堆内存的两个大区域,两个区域分别存储new出来 的“A”和“B”,至于a和b里的内容究竟是什么不用管它,只知道通过a和b里面的内容可以找到“A”和“B”,为了方便理解,且以为它存储的是堆内存里两个区域的地址。
再看下一句。
operator(a,b);
将a,b的值传递给函数operator,注意 是值,按照我们的理解传递的就应该是堆内存的两个区域的地址。再看到operator函数,栈内存再开辟两个区域,分别是x和y,x的值就是a的值(即“A”的地址),y的值就是b的值(即“B”的地址)。所以x和y分别指向“A”和“B”。而在main里,a指向“A”,b指向“B”。
x.append(y);
这句好理解,x指向的内容(“A”)在该句后变成“AB”。
y = x;
将x的值(即“A”的地址)赋给y。此时y就指向了“AB”。
那么,System.out.println(a + "," + b);就好理解了,a指向“AB”,b指向“B”,因此输出"AB,B"
画个图就好理解了
public static void stringReplace(String text){
text=text.replace('j', 'i');//这里也该修改了值了吧??为什么结果就是没有呢 难道String传的不是地址是值??
}
public static void bufferReplace(StringBuffer text){
text=text.append("C");
}
public static void main(String[] args) {
String textString = new String("java");
StringBuffer textBufferString = new StringBuffer("java");
stringReplace(textString);
bufferReplace(textBufferString);
System.out.println(textString + textBufferString);// 结果javajavaC
}
text=text.append("C");//外面看到的是append的效果,而不是“=”的效果,你可以把=去掉测试一下,这里这个=根本就没有必要存在
} public static void stringReplace(String text){
text=text.replace('j', 'i');//这里也该修改了值了吧??为什么结果就是没有呢 难道String传的不是地址是值??
}//这个方法根本没有任何有意义的功能
这个去看String类的replace的说明,String是个不变类,所以设计到修改的方法都是返回来一个 新的对象,不对原来的对象进行修改。