日期:2014-05-20  浏览次数:20765 次

JAVA引用、非引用[菜鸟求解]

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
b

stringbuffer是进行引用传递,string是值传递?这个解释对吗?
不是说只要new一个对象,就能得到一个引用,为什么我在用string给值后,应该是更新引用区域的值,为什么没有被更新掉!!!
------最佳解决方案--------------------
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方法,是修改自己内部的属性,并没有修改自己的地址引用,这个对象的引用还是原来的那一个。

对象重新赋值和修改属性,这两个操作要分开理解。

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

------其他解决方案--------------------
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) {