public static void main(String[] args) {
testMethod();
} public static void testMethod() {
String i = new String("a");
String k = new String("b");
StringBuffer a = new StringBuffer("AAA");
StringBuffer b = new StringBuffer("BBB");
setMethod(a, b);
setMethod(i, k);
System.out.println(a);
System.out.println(b);
System.out.println(i);
System.out.println(k);
} public static void setMethod(StringBuffer a, StringBuffer b) {
a.append("BBBCCC");
b.append("AAADDD");
} public static void setMethod(String a, String b) {
a = "10";
b = "20";
}输出结果:
AAABBBCCC
BBBAAADDD
a
bstringbuffer是进行引用传递,string是值传递?这个解释对吗?
不是说只要new一个对象,就能得到一个引用,为什么我在用string给值后,应该是更新引用区域的值,为什么没有被更新掉!!!

解决方案 »

  1.   

    java 是按值传递的,所有的对象都是。没有引用传递一说。这里的值是指引用地址的值。public static void setMethod(String a, String b) {
            a = "10";
            b = "20";
        }
    这里的 a= "10",是指将对象a的地址又赋给 "10"这个字符串的地址去了。但是 外同的a和这里的a,并不是同一个对象,它们只不过是恰好共享了同一个内在而已。你现在把里面的a的内存指向改了,但这个改变不了外面的对象的指向的。上面的解释从C++来解释,理解很抽象,但这是java的精粹,你不了解这个。其他的很多都不会了解的。在java中 =从来都是修改该对象的值所在的地址,即不能改变对象本身的值的。比如:
    a = b;
    a = c;
    原来的b还是b,而a只不过转向c的地址去了而已。而你上面的stringbuilder,他的append方法,是修改自己内部的属性,并没有修改自己的地址引用,这个对象的引用还是原来的那一个。对象重新赋值和修改属性,这两个操作要分开理解。
      

  2.   

    LZ,首先我也和你纠正一下,在java中,传递的都是按值传递,没有传地址的说法,因为在java里面,对与引用的话,传的是地址的值。
    这里和 引用的关系不是很有关。
    为什么会打印出上面的情况呢?
      其实你要从 Strin 和 StrinBuffer 的属性去出发。
    平时我们说的字符串,输出的都是 String,注意:String一旦被创建,它的值自始直终都不可以再变了,而StringBuffer是可以变的,但是我们要打印出来的时候也要将它转换成为 String(你可以去看看规范),(上面其实是自动转换的(print的时候)。
      

  3.   

    public class StringTest3
    {
    public static void main(String[] args) {
            testMethod();
        }
     
        public static void testMethod() {
            String i = new String("a");
            String k = new String("b");
            StringBuffer a = new StringBuffer("AAA");
            StringBuffer b = new StringBuffer("BBB");
            setMethod(a, b);
            setMethod(i, k);
            System.out.println(a); // AAABBBCCC
            System.out.println(b);//BBBAAADDD
            System.out.println(i);//a
            System.out.println(k);//b
        }
     
        public static void setMethod(StringBuffer a, StringBuffer b) {
            a.append("BBBCCC");
            b.append("AAADDD");
        }
     
        public static void setMethod(String a, String b) {
            a = "10";
            b = "20";
    System.out.println(a); //这样就能输出了,
    System.out.println(b);
        }
    }在值传递的过程中,始终传的是值,在java中没有传引用这一说。
    a = "10";
    b = "20";
    这是定义在方法体内的两个量,会给他们分配内存,可是这两个量的值,不会因为实际参数的改变而改变,因为这两个参数的作用域仅在方法体,他们可以和实际参数共享一个内存,他不会改变实际参数的地址。仅仅是指向的地址变了
      

  4.   

    代码是想考你: StringBuffer和String的区别
    前者内容可以改变,后者不可以改变
    所谓的“引用传递” ,我理解就是 按值传递 ,只是前者内存内容可以操纵,后者不可操纵。
      

  5.   

    lz,字符串是一个不可变类型,一经创建不可更改String s1 = new String("123");和String s2 = "123";仔细体会下两者的区别,相信你会有所收获。
      

  6.   

    这么说吧,你记住两点就OK了:
    1,对于简单类型 和 String strABC = "123";  这两种定义是值传递。
    2,其余的所有对象都是引用传递。至于 概念上就不要纠结了,没有意义。
      

  7.   

    楼上的已经说的差不多了,在java中,只有值传递,其实研究太多也没有什么意思。另外,string一旦指定,其值是不变的,之所以有变的,是因为重新赋值,会让变量指向一个新的内存地址。