你不能修改原来变量,只能对原来对象进行操作。比如你在方法里调用s.append,再打印就不一样了,但是你如果s=t这种是没用的

解决方案 »

  1.   

    这样看就很好理解了。 public static void main(String[] args) { try { String m = "123";
    {
    String s1 = m;
    s1 = "456";
    s1 = s1.concat("456");
    }
    System.out.println(m);
    System.out.println("change m = " + m);
    System.out.println("m = " + m);
    StringBuffer n = new StringBuffer("123");
    {
    StringBuffer s2 = n;
    StringBuffer t = new StringBuffer("456");
    s2 = t;
    }
    System.out.println("n = " + n); } catch (Throwable e) {
    e.printStackTrace();
    } }
      

  2.   


    public static void changeStringBuffer(StringBuffer s)  // 传进来是s的拷贝
    {  
            StringBuffer t = new StringBuffer("456");
            s = t;  // 将拷贝的地址指向了新的对象空间,这时,s 的拷贝已经不指向之前的s 的地址了,而是刚new 的t 
    }
      

  3.   

    StringBuffer s = new StringBuffer("456");
    s = new StringBuffer("789");这怎么解释。
      

  4.   

    mian方法里的属性或者对象,都是方法内局部的,而你的其他两个方法,他们里面的属性或者对象,也都是局部的,两个互不干扰的局部变量,怎么会影响值的改变?好比你有张美女照,然后你复制一分给了你的基友,你基友把你复制的这份美女照给丑化了,你的美女照会受影响么?
      

  5.   

    public static void changeStringBuffer(StringBuffer s)  // 传进来是s的拷贝
    {  
            StringBuffer t = new StringBuffer("456");
            s = t;  // 将拷贝的地址指向了新的对象空间,这时,s 的拷贝已经不指向之前的s 的地址了,而是刚new 的t 
    }StringBuffer n = new StringBuffer("123");  // 调用之前传递的是123
    changeStringBuffer(n);   // 这里面将n的拷贝指向了t,也就是456的地址
    但 n 指向的仍然是123
      

  6.   

    main方法和changeString、changeStringBuffer都是方法,他们内部的属性都是局部变量,如果想改变值,把main里的String m = "123" 放在类中方法外,提升为全局变量;这就好比一个张照片,你借给了你基友,然后你基友把照片改了,你又要回来了;
      

  7.   

    main方法和changeString、changeStringBuffer都是方法,他们内部的属性都是局部变量,如果想改变值,把main里的String m = "123" 放在类中方法外,提升为全局变量;这就好比一个张照片,你借给了你基友,然后你基友把照片改了,你又要回来了;
    我楼上说错!!!!!你main方法外的两个方法,他们参数内的是两个局部变量,你把值传给那两个局部变量,而局部变量改变的只是他自身的值而已,好比a=1;b=a;b=3;a依然是1
      

  8.   

    String和StringBuffer是两个相互独立的类,没有继承关系。
    你可以用 StringBuffer的对象。toString操作传递给String.
      

  9.   

    使用StringBuffer新建对象(s1)时,对象s1在堆内存中,里面的字符内容(a1)在常量池,s1指向a1; 同理, 调用changeStringBuffer()方法,里面又新建一个对象(s2),s2中的字符内容(a2)也在常量池,s2指向a2.   将s1传入changeStringBuffer中后,虽然在该方法中s1 = s2 ,  s1也指向了a2,   但是堆内存中的s2却并未改变, 还是指向a1.         不知道这样解释对不对。
      

  10.   

    通过方法来改变变量的值是不行的(这个值是指引用的值),可以这样来理解。当将变量传递给方法时,在方法的里边建立了一个变量(这个变量的作用域在这个方法内),这个变量的引用指向和你传递进来的参数指向相同的地址。变量直接赋值是改变的引用,对值没有影响。所以你将t直接赋值给s2(这个s2是方法内部的变量有别与你方法外部的那个s2),所以你改变这里的s2对你外边输出的s2没有影响。如果你是去该变的,比如通过s2.append("xxxx"),你再方法外再次输出的时候发现值已经改变,这里就是改变的引用指向的值。
      

  11.   

    你在调用changeStringBuffer方法时,传递的是StringBuffer对象实例的引用没错,changeStringBuffer方法体里面
    StringBuffer t = new StringBuffer("456");
             s = t;
    只是改变了方法参数s的引用地址,并没有改变实参 n 的对象引用。
    而你打印的是实参 n 的引用的对象内容。当然不会改变了
      

  12.   

    我不认可你的说法。我觉得java传对象的时候实质上就是传的地址,或者更精确的讲,传对象就是传地址的引用。
    java堆通过引用来管理java对象,而java不允许直接获取地址,那么我们只能委婉的通过引用来找到一个确定的对象。
    像LZ说的:
    main: SB sb1 = "123"; change(sb1);
    change: SB sb2 = "456"; sb1 = sb2;
    实际上是改变了change方法中sb1引用的目标,也就是将sb1的引用指向了sb2的对象。但是change方法里的sb1只是"123"对象的一个引用的副本。也就是说mian方法里的引用并没有被修改。
    进一步说,为什么下面的代码不需要return 语句 public static void main(String[] args) {
    StringBuffer sb = new StringBuffer("123");
    change(sb);
    System.out.println(sb);
    }
    static void change(StringBuffer s){
    s.append("abc");
    }
    为什我们传递对象的时候么不需要像传值那样需要return new value呢,因为change方法接收的参数是一个sb的引用的副本,改变了目标地址的值,因此不需要return.
      

  13.   

    因为你把n传给了changeStringBuffere,但你的方法里却没有任何返回值。所以changeStringBuffere里对传进去的值做任何操作都只是在他自己的方法内有效。除非你返回值,然后再在主方法里接受返回的值。