在下不明白,什么时候是传值,什么时候是引用?
赋个例子:List<String> list =new ArrayList<String>();
list.add("a");
List<String> byQuote = list;
list.add("b");
System.out.println(byQuote.toString());
                //结果[a, b],说明是传引用

String str = "a";
String byValue = str;
str+="b";
System.out.println(byValue);
                //结果是a,说明是传值

解决方案 »

  1.   

    ...如果非要区分,基础类型传的是本身的值,对象类型传的是引用。但是String是特殊的对象,建议你看看String的源文件,final类型。String byValue = str; 这个动作应该是新建了一个对象副本
      

  2.   

    ls误人子弟,String、Integer等都是immutable的类
      

  3.   

    http://blog.csdn.net/exterminator/archive/2010/12/04/6055297.aspx
      

  4.   

    发现这么多人总是在这个地方迷惑,难道现在的java教材就不能把这个部分详细说明一下?以前的java教材有值传递和引用传递,值传递传递的是变量的值,引用传递传递的是对象的地址(注意是对象的地址,不是变量的地址)
    现在的java教材好像都称为值传递,上面说了,引用传递传递的是对象的地址,而不是变量的地址,那么变量的值是什么?变量的值就是这个对象的地址,即String s = "abc"; s的值实际上是"abc"的地址,s只是个变量,"abc"才是对象,s="abc"是让变量指向"abc"对象的地址,也就是说让s引用"abc",所以说s的值是个地址,s的内容才是"abc"字符串,从这个角度来看,引用传递也算是一种值传递,传的是变量的值(注意是变量的值,不是对象的值),因为变量的值就是对象的地址。
    所以,当看到值传递的说法时,要知道,这里所说的是传递的是变量的值,简单类型的变量的值,就是变量本身的内容,对象类型的变量的值就是对象的地址。当看到引用传递的说法时,要知道,这里所说的是传递的是对象的地址(注意不是变量的地址)         List<String> list =new ArrayList<String>(); //list变量指向一个ArrayList对象,
                                                                //即list是ArrayList对象的地址
            list.add("a"); //这里是往list指向的地址追加信息
            List<String> byQuote = list; //byQuote变量的值=list的值,
                                               //也就是=ArrayList对象的地址
            list.add("b"); //这里是往list指向的地址追加信息
            System.out.println(byQuote.toString()); //byQuote变量的值和list的值一样,
                                                           //都是ArrayList对象的地址,
                                                           //所以打印的是同一个地址的内容
                    //结果[a, b],说明是传引用
            
            String str = "a"; //str指向"a"对象,即s是"a"的地址
            String byValue = str; //byValue变量的值=str的值,也就是="a"的地址
            str+="b"; //str重新赋指,也就是str指向新的对象"ab"的地址,
                        //注意这里str变量变了,但是byValue没变
            System.out.println(byValue); //byValue的值是"a"地址,所以打印"a"地址的内容
                    //结果是a,说明是传值
    LZ再来体会
    List<String> list =new ArrayList<String>(); 
    List<String> byQuote = list;
    list = new ArrayList<String>(); //list重新赋值,改变list的指向,
                                         //注意体会这里根上面的str+="b"的相似性,
                                         //都是改变了变量的值,让它指向新的地址
    list.add("a"); 
    System.out.println(byQuote.toString()); 
      

  5.   

    java只有值传递
    c也只有值传递
    c++有引用传递
      

  6.   

    传基本类型是是直传递,传引用类型时是传地址的值,
    public class Pass {
    public void test(int i){
    i=i/5;
    System.out.println("i=:"+i);//i=1
    }
    public void test(product p){
    //p=new product();把这个加上后,新开辟一个地址,指向的就不同了,q还是指向100,p指向20
    p.setPrice(20);
    System.out.println("p.price=:"+p.getPrice());//20
    }
    public static void main(String[] args) {
    Pass p=new Pass();
    int t=5;
    p.test(t);
    System.out.println("t=:"+t);//i=5   i值不变,在堆中有i,t两个变量,他们没有关系,只不过i和t的值都等于5而已


    product q=new product();
    q.setPrice(100);//100
    p.test(q);
    System.out.println("q.price=:"+q.getPrice());//20 开始两个都指向内存中price=100的地方,
    //然后那个内存地址的price值改变为20,两个值就都改变成为了20,说明他们都指向同一个地址。传的也是地址了嘛


    }}product.javapublic class product {
     int price;
    product(){

    }
    public int getPrice() {
    return price;
    } public void setPrice(int price) {
    this.price = price;
    }

    }
      

  7.   

    都是传值的。
    LZ的例子都是把指向的地址传给了另一变量。
    只是第一个例子,两个变量指向同一个地址,所以打印是一样的;
    而第二个例子,str开向指向的地址改变了(str+="b" 之后,ab存放在一个新的地址,而str指向了这个新地址),而byValue的指向没有变。所以两个变量指向的内容也就不一样了。
      

  8.   

    String str = "a";
            String byValue = str;
            str+="b";
    因为String的值是不可变的,str+="b"实际上是new了一个新的string,不再指向原来的对象了