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?

解决方案 »

  1.   

    Java  只有传值。
    sb2 不能改变其引用。
      

  2.   

    java传递参数的方式是值传递的方法
      

  3.   

    推荐你去这里看一下
    http://blog.sina.com.cn/s/blog_4b622a8e0100c1bo.html
      

  4.   

    观望中 
    我个认为可能是 static 的原因
    笔者不妨试试
    休息去了zz
      

  5.   

    因为刚开始调用add方法时,add方法中的sb2引用变量和main方法中的sb2引用变量,指向同一个对象,放的是同一个对象的首地址,但是在add方法中,sb2=sb1;这句话执行后,add方法中sb2指向的对象就变成sb1指向的对象了。不会改变main方法中sb2所指向的对象。
    一堆,不知道楼主能不能看懂。
    原理就是1楼所说的了。
      

  6.   

    函数add中的sb2是内部变量,和main中的sb2不是同一个,它隐藏了外部的变量
      

  7.   

    我来解释下吧 
    首先main函数中有个栈  然后放入sb1,sb2  他们分别指向堆中的地址,两个个地址都保存"A"字符串对象,
    然后是add函数   也有一个栈  其中也有sb1,sb2  由于main函数中的是引用类型不是简单类型,那么main函数所传给add函数的就是地址不是值    你可以就把它们当做C中的指针来看待~~
    但是在add方法中,sb2=sb1;这句话执行后,add方法中sb2指向的对象就变成sb1指向的对象了
    不知道楼主能不能看懂  
      

  8.   

    java  的变量有两种 基本类型八个 和引用类型;
    java里的参数传递是值的传递!
    当你 new 对象时 str1 指向了"A"的地址 str2指向了另一个"A"的地址,注意STR1不等str2;
     当你调用ADD方法时 STR1和STR2分别把自己的值给ADD方法的参数STR1和STR2;
    这是ADD方法中的STR1指向了第一个“A”你给她加B 他就加了 然后你又把ADD方法里的SR2指向了第一个“a”这时候ADD方法已经结束 所以当你在MAIN里执行输出语句时输出的是A.
      

  9.   


    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
    可以再分析一下吗??
      

  10.   


    可以在纸上划张图,首先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
      

  11.   

    sb1与sb2只是对象的引用,说简单点就是像C中的指针,但java中没有指针,我们说是引用。如果想让sb2引用的对象的内部变,不能这样的!
      

  12.   

    正解!!!
    add()结束后,形参消失,方法执行的效果也就没有了!
      

  13.   

    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);
        }}StringBuffer对象通过append方法是可以改变其引用的,故sb1输出AB,通过"="号赋值不能改变其引用,故sb2还是A
      

  14.   


    对于引用变量来说  值就是地址  比如String 类型的  数组类型的对于简单类型来说 值就是直接量   比如int类型的  什么是引用   是这样的   比如有个String的数据  那么它自己是不能有数据的   
    它只能引用堆中的数据  而它自己是在栈中的   这就叫引用行参 这个C语言里面应该有讲的  好好翻翻书
      

  15.   

    这个只能说add方法中的sb2变成了“AB”  而在main方法中是不会变的