public class demo { public static void add(StringBuffer sb1,StringBuffer sb2)
{
sb1.append("B");
sb2 = sb1;
}
public static void main(String[] args) {
StringBuffer sb1 = new StringBuffer("A");
StringBuffer sb2 = new StringBuffer("A");
add(sb1,sb2);
System.out.println(sb1);
System.out.println(sb2);
}}sb2的结果为什么还是A?
sb2 不能改变其引用。
http://blog.sina.com.cn/s/blog_4b622a8e0100c1bo.html
我个认为可能是 static 的原因
笔者不妨试试
休息去了zz
一堆,不知道楼主能不能看懂。
原理就是1楼所说的了。
首先main函数中有个栈 然后放入sb1,sb2 他们分别指向堆中的地址,两个个地址都保存"A"字符串对象,
然后是add函数 也有一个栈 其中也有sb1,sb2 由于main函数中的是引用类型不是简单类型,那么main函数所传给add函数的就是地址不是值 你可以就把它们当做C中的指针来看待~~
但是在add方法中,sb2=sb1;这句话执行后,add方法中sb2指向的对象就变成sb1指向的对象了
不知道楼主能不能看懂
java里的参数传递是值的传递!
当你 new 对象时 str1 指向了"A"的地址 str2指向了另一个"A"的地址,注意STR1不等str2;
当你调用ADD方法时 STR1和STR2分别把自己的值给ADD方法的参数STR1和STR2;
这是ADD方法中的STR1指向了第一个“A”你给她加B 他就加了 然后你又把ADD方法里的SR2指向了第一个“a”这时候ADD方法已经结束 所以当你在MAIN里执行输出语句时输出的是A.
public class Stringdemo { public static void add(StringBuffer sb1, StringBuffer sb2) {
sb1=sb2;
sb1.append("B");
sb2 = sb1;
sb1=sb2;
System.out.println("static sb1:"+sb1);
System.out.println("static sb2:"+sb2); } public static void main(String[] args) {
StringBuffer sb1 = new StringBuffer("A");
StringBuffer sb2 = new StringBuffer("A");
add(sb1, sb2);
System.out.println("main sb1:"+sb1);
System.out.println("main sb2:"+sb2);
}}
static sb1:AB
static sb2:AB
main sb1:A
main sb2:AB
可以再分析一下吗??
可以在纸上划张图,首先add()方法里的sb1和sb2换成a和b,那么栈里存放4个引用,a,b,sb1,sb2,这时候a和sb1指向的是堆中同一块内存,b和sb2指向的是堆中另一块一块内存,进add()方法,a=b,这是a指向堆中的内存变为b和sb2指向的“A”,所以a.append("b"),改变的是a,b,sb2指向的同一块内存"AB",这之后只有sb1指向的还是"A",所以最后的输出结果是
static a(即sb1):AB
static b(即sb2):AB
main sb1:A
main sb2:AB
add()结束后,形参消失,方法执行的效果也就没有了!
{
sb1.append("B");
sb2 = sb1;
}
public static void main(String[] args) {
StringBuffer sb1 = new StringBuffer("A");
StringBuffer sb2 = new StringBuffer("A");
add(sb1,sb2);
System.out.println(sb1);
System.out.println(sb2);
}}StringBuffer对象通过append方法是可以改变其引用的,故sb1输出AB,通过"="号赋值不能改变其引用,故sb2还是A
对于引用变量来说 值就是地址 比如String 类型的 数组类型的对于简单类型来说 值就是直接量 比如int类型的 什么是引用 是这样的 比如有个String的数据 那么它自己是不能有数据的
它只能引用堆中的数据 而它自己是在栈中的 这就叫引用行参 这个C语言里面应该有讲的 好好翻翻书